Android 自定义视图测量
我创建了一个自定义视图-它扩展了Android 自定义视图测量,android,view,android-view,android-custom-view,Android,View,Android View,Android Custom View,我创建了一个自定义视图-它扩展了视图。在onDraw()方法中,我创建了一个具有设定半径的圆。目前在我的xml中,layout\u width和layout\u height设置为wrap\u content。圆圈大小正确,但当我设置onClickListener时,我不必触摸圆圈即可注册。我可以点击任何没有其他视图的地方 我想我需要用onMeasure或LayoutParams做些什么,但我不知道具体是什么 这样做的目的是,仅当我单击圆形时,才调用onClickListener,而布局的宽度和
视图
。在onDraw()
方法中,我创建了一个具有设定半径的圆。目前在我的xml中,layout\u width
和layout\u height
设置为wrap\u content
。圆圈大小正确,但当我设置onClickListener
时,我不必触摸圆圈即可注册。我可以点击任何没有其他视图的地方
我想我需要用onMeasure
或LayoutParams
做些什么,但我不知道具体是什么
这样做的目的是,仅当我单击圆形时,才调用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);
}
试试这个:
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;
}
wrap_content
意味着使用包裹该视图内容的最小尺寸,因此您需要告诉android在onMeasure()
方法中这些最小尺寸是多少。@Luksprog那么我可以让widthMeasureSpec,heightMeasureSpec
等于我的圆半径吗?编辑:是的,这是可行的,但它会产生一个sqaure…使用半径是一个基本方法,但视图可能会收到一些其他约束。视图也是一个矩形,因此不能使其成为圆形或任何其他形状。但是,您可以覆盖它的onTouch
方法,并仅当触摸在圆圈区域中注册时触发单击事件。@Luksprog我理解onTouch()
部分,但我不能使视图成为圆形。在我设置尺寸之前,这是一个很好的圆圈。我已经添加了代码来向您展示。输出是正方形而不是圆形。感谢您的回答,但这仍然输出为-圆形-正方形。那么您到底想要什么?抱歉!我的意思是它仍然以正方形输出。我没有带编译器,所以请运行并告诉我发生了什么。发现一个错误。。。等待