【问题标题】: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() 部分,但不是我不能使我的观点循环的事实。在我设置尺寸之前,这是一个很好的圆圈。
  • 我已经添加了我的代码给你看。输出是正方形而不是圆形。

标签: android view android-view android-custom-view


【解决方案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。
  • 那你到底想要什么?
  • 对不起!我的意思是它仍然输出为正方形
  • 我没有编译器,所以请运行并告诉我会发生什么。
  • 发现一个错误...等等
猜你喜欢
  • 1970-01-01
  • 2013-08-15
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多