使用onDraw扩展android按钮

使用onDraw扩展android按钮,android,android-view,android-custom-view,android-button,Android,Android View,Android Custom View,Android Button,我想更改我的按钮形状,但我想使用onDaw方法和扩展按钮 班级。所以我刚开始做的是: <view class = "com.example.button.MainActivity$MyButton" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 但我在按钮视图矩形上有一个蓝色圆圈 我想把蓝色的圆圈看作一个按钮形状,然后我就可以看到矩形了。 有

我想更改我的按钮形状,但我想使用onDaw方法和扩展按钮 班级。所以我刚开始做的是:

     <view class = "com.example.button.MainActivity$MyButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
但我在按钮视图矩形上有一个蓝色圆圈

我想把蓝色的圆圈看作一个按钮形状,然后我就可以看到矩形了。
有什么帮助吗?

在xml中将背景设置为透明(就像上面所说的那样),并覆盖onTouchListener,这样只有在单击蓝色圆圈时,单击才有效

setOnTouchListener可控制单击位置是否在蓝色圆圈内。你可以得到像这样的触摸位置

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


您忘记了super.onDraw(canvas)调用。是的,但仍然存在相同的问题。在这方面我可能有点离题,但请尝试将xml背景设置为透明。实际上,这是我项目的主要思想,如果我将按钮的背景更改为透明,在圆圈周围单击可能会调用按钮单击方法。您的getWidth和getHeight方法是错误的。使用canvas.getWidth和canvas.getHeightGood,但是如果我的形状有点复杂,我应该怎么做才能找到答案,例如五角大楼之类的东西。找到好的规则来检查任何点是否被它包围是很困难的。我认为除非你能够更精确地定义你的形状(例如,说明什么样的函数构建你的形状的边,并将它们与触摸事件的坐标进行比较),那么android本身只能给你一个包含你的形状的矩形。我的形状是由路径构建的。我走在我形状的边缘上。
    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);

      } 
}
@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);
            }
        }
    });
}