通过使用onDraw扩展Android按钮

4

我希望更改我的按钮形状,但是我想使用 onDraw 方法并扩展按钮类。所以我刚开始所做的是:

     <view class = "com.example.button.MainActivity$MyButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />

并且

    public static class MyButton extends Button {


     public MyButton(Context context) {
      super(context);

     }

     public MyButton(Context context, AttributeSet attrs) {
      super(context, attrs);

     }

     public MyButton(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);

     }

     @Override
     protected void onDraw(Canvas canvas) {

            Paint paint = new Paint();
            paint.setColor(Color.BLUE);
            paint.setStrokeWidth(10);
            paint.setStyle(Style.FILL);
            int width = getWidth();
            int height = getHeight();
            canvas.drawCircle(width/2, height/2, height/3, paint);

      } 
}

但是我在一个矩形按钮视图上看到了一个蓝色圆圈。
我想只看到蓝色圆圈作为按钮形状,而不要矩形。
有什么帮助吗?

是的,但问题仍然存在... - mmlooloo
我可能完全错了,但是尝试在XML中将背景设置为透明。 - hypd09
实际上这是我的项目的主要思路,如果我将按钮的背景更改为透明,点击圆圈周围可能会调用按钮点击方法。 - mmlooloo
你应该将背景设置为透明,但我认为你还应该重写onMeasure()方法,以使按钮不会比其内部实际圆形更大。当然,这取决于你的用例。 - EpicPandaForce
重写 onMeasure() 方法并不实用,因为矩形的角仍然会出现在屏幕上。 - mmlooloo
显示剩余2条评论
1个回答

1

在xml中将背景设置为透明(就像hypd09所说的那样),并覆盖onTouchListener,以便只有在单击蓝色圆圈时才起作用。

使用setOnTouchListener来控制点击位置是否在蓝色圆圈内。您可以像this这样获取触摸位置。

甚至可以通过以下方式设置onClickListener(将其添加到您的MyButton类中):

@Override
public void setOnClickListener(final OnClickListener onClickListener) {
    MyButton.this.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event){
            if (isWithinCircle(event))
            {
                onClickListener.onClick(v);
            }
        }
    });
}

如果我的形状比较复杂,例如五边形之类的,我该怎么办才能找到答案呢?找到一个好的规则来检查任何点是否被包含在内是很困难的。 - mmlooloo
我认为,除非你能更精确地定义你的形状(例如通过说明构建你的形状边的函数类型并将其与触摸事件的坐标进行比较),否则Android本身只能给你包含你的形状的矩形。 - Bartek Lipinski
我的形状是由路径构建的。我沿着我的形状边界行走。 - mmlooloo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接