Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何制作背景形状的按钮_Android_Button_Background_Shape - Fatal编程技术网

Android 如何制作背景形状的按钮

Android 如何制作背景形状的按钮,android,button,background,shape,Android,Button,Background,Shape,我只想要一个背景形状的按钮 例如,我有这样的图像: 我把它作为一个ImageButton的背景我想要的是按钮的形状是一样的,而不是保持矩形。您可以扩展视图类,在onSizeChanged中为图像定义闭合路径(使用实体部分和数学的边界以及视图的宽度和高度),并覆盖其onTouch,以仅响应位于上述闭合路径中的触摸。因此,最终您将能够实现您想要的行为。虽然Virendra Singh的答案是正确的,但我觉得在一般情况下使用路径可能太难了 要处理所有情况,您需要进行逐像素测试。每像素测试绘制视图并测

我只想要一个背景形状的按钮 例如,我有这样的图像:


我把它作为一个ImageButton的背景我想要的是按钮的形状是一样的,而不是保持矩形。您可以扩展视图类,在
onSizeChanged
中为图像定义闭合路径(使用实体部分和数学的边界以及视图的宽度和高度),并覆盖其
onTouch
,以仅响应位于上述闭合路径中的触摸。因此,最终您将能够实现您想要的行为。

虽然Virendra Singh的答案是正确的,但我觉得在一般情况下使用路径可能太难了

要处理所有情况,您需要进行逐像素测试。每像素测试绘制视图并测试触摸的像素是否可单击。代码非常简短:

public class BitmapButton extends Button {

    private final Bitmap bitmap;
    private final Canvas canvas;

    public BitmapButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
        canvas = new Canvas(bitmap);
    }

    public boolean onTouchEvent(MotionEvent event) {
        bitmap.setPixel(0, 0, 0); // reset pixel
        canvas.save();
        canvas.translate(-event.getX(), -event.getY());
        draw(canvas); // draw only the touched pixel
        canvas.restore();
        // pass touch events when the pixel is clickable
        return Color.alpha(bitmap.getPixel(0, 0)) > 0 && super.onTouchEvent(event);
    }
}