0

我刚开始学习如何制作自定义视图。我在屏幕底部创建了一个可绘制对象,并在其中创建了一个小圆圈。布局工作得很好,但有一个小问题,不同分辨率的可绘制对象被裁剪。它在 S3 中运行良好,但在其他设备中情况有所不同。在此处输入图像描述

在此处输入图像描述

这是我的代码:

 @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {


    int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
            MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY);
    int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
            MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY);


    setMeasuredDimension(childWidthMeasureSpec,childHeightMeasureSpec);


}


@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    Drawable outer_ring = getResources().getDrawable(R.drawable.outer_ring);

    System.out.println("Height now is : "+(canvas.getHeight()));

    Rect r1 = new Rect();
    r1.top = (canvas.getHeight()-outer_ring.getIntrinsicHeight());
    r1.bottom = canvas.getHeight();
    r1.left = (canvas.getWidth()-outer_ring.getIntrinsicWidth())/2;
    r1.right = canvas.getWidth()/2 +outer_ring.getIntrinsicWidth()/2;

    outer_ring.setBounds(r1);
    outer_ring.draw(canvas);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.BLACK);
    paint.setStyle(Style.STROKE);
    paint.setStrokeWidth(10.0f);

    canvas.drawCircle(canvas.getWidth()/2, ((canvas.getHeight()-outer_ring.getIntrinsicHeight()/2)), 20, paint);
}

这种观点在所有分辨率上都相同的解决方案应该是什么

这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >



    <com.example.testing.CustomMenu
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/myView"
        />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Button" />

</RelativeLayout>
4

2 回答 2

2

编辑

事实证明,提供给的画布大小onDraw不能保证与实际查看的View. 它只是保证足够大。在你的情况下,它太大了!

根据this question and answer,关键是使用返回的大小onSizeChanged作为当前显示的大小的确定值View。因此,您应该保留 中的尺寸onSizeChanged,并使用它们onDraw来了解您应该绘制的实际尺寸。

  • childWidthMeasureSpec并且childHeightMeasureSpec应该成为设置在onSizeChanged.
  • onDraw中,分别使用它们代替canvas.getWidth()canvas.getHeight()

虽然这种行为乍一看有点奇怪,但它允许 android 在整理尺寸时减少它重新分配的画布数量:如果 aView缩小一点(例如,出现顶栏)它就会告诉所有有关人员实际大小要小一些,而不是通过画布发布和重新创建循环。

可能不太重要,在您的 java 代码中,您请求View绘制的尺寸。在 xml 中,您将这些尺寸设置为wrap_content. 这意味着没有明确设置View. 像这样的视图应该请求它可以达到的最大尺寸,并确定它希望得到多大的尺寸,并将其设置为它的尺寸。CustomMenu更明智的做法是通过设置 to 的大小来确保维度是固定的match_patent,以便它们是固定的。

但是,在没有这一点的情况下,父母View给了你一些界限。似乎这些界限可能会或可能不会考虑到顶栏,这很公平。

于 2013-09-02T07:23:35.020 回答
0

尝试使用this.getHeight()代替canvas.getHeight()this.getWidth()代替canvas.getWidth()

this涉及到View

于 2013-09-04T22:32:43.810 回答