自定义视图测量

Posted

技术标签:

【中文标题】自定义视图测量【英文标题】:Custom view measuring 【发布时间】:2013-10-06 10:50:00 【问题描述】:

我制作了一个自定义视图 - 它扩展了 View。在onDraw() 方法中,我创建了一个具有设定半径的圆。目前在我的 xml 中,我将 layout_widthlayout_height 设置为 wrap_content。圆圈大小合适,但是当我设置onClickListener 时,我不必触摸圆圈即可注册。我可以在没有其他视图的地方点按。

我想我需要对onMeasureLayoutParams 做点什么,但我不知道具体是什么。

目标是仅当我单击layout_widthheight 仍设置为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。 那你到底想要什么? 对不起!我的意思是它仍然输出为正方形 我没有编译器,所以请运行并告诉我会发生什么。 发现一个错误...等等

以上是关于自定义视图测量的主要内容,如果未能解决你的问题,请参考以下文章

本机真棒警报自定义视图抛出错误

Android学习—— Android自定义控件

如何通过在自定义视图中按下按钮从超级视图中删除自定义视图?

将自定义视图放入自定义 ScrollView

为啥堆栈视图中的自定义视图重叠?

如何将自定义视图动画化为自定义视图