我刚开始学习如何制作自定义视图。我在屏幕底部创建了一个drawable,并在其中创建了一个小圆圈。布局工作得很好但是有一个小问题,不同分辨率的drawable被裁剪。它在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>
答案 0 :(得分:2)
修改强>
事实证明,提供给onDraw
的画布大小不能保证与View
的实际查看大小相同。它只能保证足够大。在你的情况下,它太大了!
根据this question and answer,关键是使用onSizeChanged
中返回的尺寸作为View
当前显示尺寸的最终尺寸。因此,您应该保留onSizeChanged
的尺寸,并在onDraw
中使用它们来了解您应该绘制的实际尺寸。 即,
childWidthMeasureSpec
和childHeightMeasureSpec
应该成为onSizeChanged
中设置的类变量。onDraw
中,分别使用canvas.getWidth()
和canvas.getHeight()
代替View
。虽然这种行为乍一看似乎有点奇怪,它允许android在排序大小时降低它所做的画布重新分配的数量:如果View
缩小了一点(例如。<所有它都会告诉所有相关实际尺寸稍微小一点,而不是通过画布释放和重新创建循环。
可能不那么重要,在您的java代码中,您要求绘制的wrap_content
的尺寸。在xml中,您将这些维度设置为View
。这意味着没有明确设置CustomMenu
的大小。像这样的视图应该请求它可以的最大尺寸,并确定它希望给它的大小,并将其设置为它的大小。通过将match_patent
的大小设置为View
来确保维数是固定的,这样更明智。
但是,如果没有,父{{1}}给了你一些限制。似乎这些界限可能会,也可能不会考虑到顶栏,这是公平的。
答案 1 :(得分:0)
尝试使用this.getHeight()
代替canvas.getHeight()
和this.getWidth()
代替canvas.getWidth()
。
(this
与View
)