Android 使用事件单击创建自定义控件

Android 使用事件单击创建自定义控件,android,android-layout,custom-controls,Android,Android Layout,Custom Controls,我正在创建一个自定义控件,如下图所示。它是一个带有1、2等位置的半圆。 当用户单击一个位置(1、2等)时,它会改变颜色(例如用户单击位置3、图像2) 我尝试使用canvas和方法绘制。但我认为这是不对的。你能帮我找到一个更好的解决方案,以及如何为用户点击该位置设置事件吗?你可以使用画布,下面是一个视图的小例子,它有两个椭圆形,可以在触摸事件中改变颜色(变为红色): class ExtraView extends View { private boolean flag1, f

我正在创建一个自定义控件,如下图所示。它是一个带有1、2等位置的半圆。

当用户单击一个位置(1、2等)时,它会改变颜色(例如用户单击位置3、图像2)


我尝试使用
canvas
和方法绘制。但我认为这是不对的。你能帮我找到一个更好的解决方案,以及如何为用户点击该位置设置事件吗?

你可以使用
画布
,下面是一个
视图的小例子,它有两个椭圆形,可以在触摸事件中改变颜色(变为红色):

class ExtraView extends View {

        private boolean flag1, flag2;
        private Paint p1, p2;
        private RectF oval1, oval2;

        public ExtraView(Context context) {
            super(context);
            flag1 = false;
            flag2 = false;
            // bigger oval paint
            oval1 = new RectF(50, 50, 460, 360);
            p1 = new Paint();
            p1.setStrokeWidth(2.0f);
            // smaller oval paint
            oval2 = new RectF(140, 140, 360, 260);
            p2 = new Paint();
            p2.setStrokeWidth(2.0f);
        }

        @Override
        public void draw(Canvas canvas) {
            canvas.drawColor(Color.GREEN);
            // bigger oval
            if (flag1) {
                p1.setColor(Color.RED);
            } else {
                p1.setColor(Color.WHITE);
            }
            p1.setStyle(Paint.Style.FILL);
            canvas.drawOval(oval1, p1);
            p1.setColor(Color.BLACK);
            p1.setStyle(Paint.Style.STROKE);
            canvas.drawOval(oval1, p1);
            // smaller oval
            if (flag2) {
                p2.setColor(Color.RED);
            } else {
                p2.setColor(Color.WHITE);
            }
            p2.setStyle(Paint.Style.FILL);
            canvas.drawOval(oval2, p2);
            p2.setColor(Color.BLACK);
            p2.setStyle(Paint.Style.STROKE);
            canvas.drawOval(oval2, p2);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                if (oval2.contains(event.getX(), event.getY())) {
                    flag2 = !flag2;
                    invalidate();
                } else if (oval1.contains(event.getX(), event.getY())) {
                    flag1 = !flag1;
                    invalidate();
                }
            }
            return true;
        }
    }

我也认为我可以在drawable中使用形状,你认为呢?可能吗?