自定义视图测量
Posted
技术标签:
【中文标题】自定义视图测量【英文标题】:Custom view measuring 【发布时间】:2013-10-06 10:50:00 【问题描述】:我制作了一个自定义视图 - 它扩展了 View
。在onDraw()
方法中,我创建了一个具有设定半径的圆。目前在我的 xml 中,我将 layout_width
和 layout_height
设置为 wrap_content
。圆圈大小合适,但是当我设置onClickListener
时,我不必触摸圆圈即可注册。我可以在没有其他视图的地方点按。
我想我需要对onMeasure
或LayoutParams
做点什么,但我不知道具体是什么。
目标是仅当我单击layout_width
和height
仍设置为wrap_content
的圆圈时才调用onClickListener
。
编辑:
这会创建一个正方形,而不是我想要的圆形。
这是我的代码:
protected void onDraw(Canvas canvas)
canvas.drawCircle(canvas.getWidth() /2 , canvas.getHeight() /2,
RADIUS, paint);
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
widthMeasureSpec = RADIUS;
heightMeasureSpec = RADIUS;
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
【问题讨论】:
wrap_content
表示使用包装该视图内容的最小尺寸,因此您需要在 onMeasure()
方法中告诉 android 那些最小尺寸。
@Luksprog 那么我可以让widthMeasureSpec, heightMeasureSpec
等于我的圆的半径吗?编辑:是的,这行得通,但它使一个广场......
使用半径是您想要的基本方法,但视图可能会收到一些其他约束。视图也是一个矩形,因此您不能将其设为圆形或任何其他形状。但是,您可以覆盖它的 onTouch
方法并仅在触摸在圆圈区域中注册时触发点击事件。
@Luksprog 我理解onTouch()
部分,但不是我不能使我的观点循环的事实。在我设置尺寸之前,这是一个很好的圆圈。
我已经添加了我的代码给你看。输出是正方形而不是圆形。
【参考方案1】:
试试这个:
float mTranslateX;
float mTranslateY;
public void onDraw(Canvas canvas)
super.onDraw(canvas);
canvas.save();
canvas.translate(mTranslateX, mTranslateY);
canvas.drawCircle(0, 0, RADIUS, paint);
canvas.restore();
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int dia = RADIUS * 2;
int w = resolveSize(dia, widthMeasureSpec);
int h = resolveSize(dia, heightMeasureSpec);
setMeasuredDimension(w, h);
float radius = Math.min(w, h)/2F;
mTranslateX = radius;
mTranslateY = radius;
【讨论】:
感谢您的回答,但这仍然输出为 -circle-square。 那你到底想要什么? 对不起!我的意思是它仍然输出为正方形 我没有编译器,所以请运行并告诉我会发生什么。 发现一个错误...等等以上是关于自定义视图测量的主要内容,如果未能解决你的问题,请参考以下文章