绘制自定义弧形视图并检测用户对每个弧形的点击

11

我正在创建自定义弧形视图,类似于彩虹视图。我可以绘制弧形视图,但无法为每个视图创建单独的点击事件。如何为每个弧形视图设置单独的点击事件?提前感谢。

这里是代码:

ArcView.java

public class ArcView extends View implements View.OnTouchListener{

    Paint paint;

    int radius, x, y;
    int color;

    public ArcView(Context context) {
        super(context);
        init();
    }

    public ArcView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ArcView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public ArcView(Context context, int radius, int x, int y, int color) {
        super(context);

        this.radius = radius;
        this.x = x;
        this.y = y;
        this.color = color;
        init();
    }

    private void init(){
        paint = new Paint();
        paint.setColor(color);
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);
        setOnTouchListener(this);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(x, y, radius, paint);
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        return false;
    } 
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
    RelativeLayout arcButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        arcButton = (RelativeLayout) findViewById(R.id.arcButton);
        arcButton1 = (RelativeLayout) findViewById(R.id.arcButton1);
        arcButton2 = (RelativeLayout) findViewById(R.id.arcButton2);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        int width=dm.widthPixels;
        int height=dm.heightPixels;

        int arcRadius1 = (int)(width/1.5);
        int arcRadius2 = arcRadius1+(int)(width/3.5);
        int arcRadius3 = arcRadius2+(int)(width/3.5);

        int xCoor = width / 2;
        int yCoor = height;

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(width, height);

        arcButton.setLayoutParams(params);
        View arcView1=new ArcView(this, arcRadius3, xCoor, yCoor, Color.RED);
        View arcView2=new ArcView(this, arcRadius2, xCoor, yCoor, Color.BLACK);
        View arcView3=new ArcView(this, arcRadius1, xCoor, yCoor, Color.BLUE);
        arcButton.addView(arcView1);
        arcButton1.addView(arcView2);
        arcButton2.addView(arcView3);

    }
}

输出:

输出屏幕

我如何为每个圆弧按钮创建单独的点击事件?


1
你不能这样做 - 相反,要创建一个自定义的“View”,其中包含多个“环”,每个环都有自己的点击监听器。 - pskink
@ pskink 感谢您的快速回复。我会尝试这个方法。 - VigneshK
我尝试分别创建三个环,并创建每个点击监听器,但它将获取最后一个视图的点击事件。 - VigneshK
@VigneshK 为什么你不能为每个视图添加点击监听器? - GensaGames
1个回答

9
有一点绕路,但它能够正常运作。将以下内容放置在ArcView中:
@Override
public boolean performClick() {
    return super.performClick();
}

@Override
public boolean onTouch(View view, MotionEvent event) {
    view.performClick();
    if (isPointInCircle((int) event.getX(), (int) event.getY())) {
        // do what you want to do and get rid of the next two lines
        String color = (((ArcView) view).color == Color.RED) ? "RED" : (((ArcView) view).color == Color.BLACK) ? "BLACK" : "BLUE";
        Toast.makeText(context, color, Toast.LENGTH_SHORT).show();
        return true;
    }
    return false;
}

private boolean isPointInCircle(int clickX, int clickY) {
    return (clickX - x) * (clickX - x) + (clickY - y) * (clickY - y) <= radius * radius;
}

请注意,要使Toast正常工作,您需要将context设为全局变量,但是最好还是尽可能摆脱使用Toast

enter image description here


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