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()
部分,但我不能使视图成为圆形。在我设置尺寸之前,这是一个很好的圆圈。我已经添加了代码来向您展示。输出是正方形而不是圆形。感谢您的回答,但这仍然输出为-圆形-正方形。那么您到底想要什么?抱歉!我的意思是它仍然以正方形输出。我没有带编译器,所以请运行并告诉我发生了什么。发现一个错误。。。等待