我刚刚开始学习如何制作自定义视图。我在屏幕底部创建了一个可绘制对象,并在其中创建了一个小圆圈。布局工作正常,但存在一个小问题,即以不同分辨率裁剪了可绘制对象。它在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>
编辑
事实证明,所提供的画布大小onDraw
不能保证与的实际查看大小相同View
。仅保证足够大。就您而言,它太大了!
According to this question and answer, the key is to use the sizes returned in onSizeChanged
as definitive for the current displayed size of the View
. So you should retain the dimensions from onSizeChanged
, and use them in onDraw
to know the actual size you should draw to. ie,:
childWidthMeasureSpec
and childHeightMeasureSpec
should become class variables which are set in onSizeChanged
.onDraw
, use them instead of canvas.getWidth()
and canvas.getHeight()
respectively.Whilst this behaviour seems a bit odd at first glance, it allows android to lower the number of canvas re-allocations it makes when sorting out sizes: If a View
shrinks a bit (eg. with the appearance of a top bar) all it does it tell all concerned that the actual size is a bit smaller, rather than going through a canvas release and re-creation loop.
可能不太重要,在您的Java代码中,您要求View
绘制的尺寸。在xml中,将这些尺寸设置为wrap_content
。这意味着没有显式设置的大小View
。这样的View应该请求它可以的最大大小,并确定它希望被赋予多大的大小,并将其设置为它的大小。通过将CustomMenu
to的大小设置为确保二维数是固定的match_patent
,这样是明智的。
但是,在没有这种情况的情况下,父母View
给了您一些限制。似乎这些界限可能考虑也可能不考虑顶部栏,这很公平。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句