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

时间:2012-03-23 08:04:09

标签: android android-layout custom-controls

我正在图片中创建如下的自定义控件。它是一个半圆形,有1,2和1等。 image1

当用户点击一个地方(1,2等)时,它会改变颜色(例如用户点击地点3,图像2)。

image2

我尝试使用canvas和方法绘制。但我不认为这是正确的。您能帮助我找到更好的解决方案,以及如何设置一个用户点击该地点的活动吗?

1 个答案:

答案 0 :(得分:3)

您可以使用canvas执行此操作,以下是View的一个小示例,其中包含2个椭圆形状,可在触摸事件中更改颜色(红色):

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