Android矩形点击效果

Android矩形点击效果,android,android-custom-view,Android,Android Custom View,我在Android中创建了一个自定义视图,根据用户的愿望,它将显示不同数量的矩形,例如3x3 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int counter = -1; for (int w = 0; w < Rectangles; w++) { for (int h = 0; h < Rectangles; h++) {

我在Android中创建了一个自定义视图,根据用户的愿望,它将显示不同数量的矩形,例如3x3

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int counter = -1;
    for (int w = 0; w < Rectangles; w++) {
        for (int h = 0; h < Rectangles; h++) {
            Rect rect = new Rect(screen * h + rowDiv, screen * w + rowDiv + topPadding,
                    screen * (h + 1) - rowDiv, screen * (w + 1) - rowDiv + topPadding);
            rectList.add(rect);
            canvas.drawRect(rect, paint);
        }
    }
}
@覆盖
受保护的void onDraw(画布){
super.onDraw(帆布);
int计数器=-1;
对于(int w=0;w<矩形;w++){
对于(int h=0;h<矩形;h++){
Rect Rect=new Rect(屏幕*h+rowDiv,屏幕*w+rowDiv+topPadding,
屏幕*(h+1)-行分割,屏幕*(w+1)-行分割+行分割);
rectList.add(rect);
画布.drawRect(rect,paint);
}
}
}
这很好,在OnTouchListener中,如果用户按下一个矩形,我想给他反馈。当前,如果用户单击矩形,它将消失,但应该更改颜色

@Override
public boolean onTouchEvent(MotionEvent event) {
    int touchX = (int) event.getX();
    int touchY = (int) event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:
        break;
    case MotionEvent.ACTION_DOWN:
        for (int c = 0; c < rectList.size(); c++) {
            if (rectList.get(c).contains(touchX, touchY)) {
                selectedRect = rectList.get(c);
                selectedRectInt = c;
            }
        }
        break;
    case MotionEvent.ACTION_UP:
        if (selectedRect != null && selectedRectInt != -1)
        if (selectedRect.contains(touchX, touchY) && rectListener != null){
            rectListener.onClick(selectedRectInt);
            invalidate(selectedRect);
        }
        selectedRect = null;
        selectedRectInt = -1;
        break;
    }
    return true;
}
@覆盖
公共布尔onTouchEvent(运动事件){
int touchX=(int)event.getX();
int touchY=(int)event.getY();
开关(event.getAction()){
case MotionEvent.ACTION\u移动:
打破
case MotionEvent.ACTION\u DOWN:
对于(int c=0;c

实现这一目标的最佳实践是什么?我必须通过调用invalidate()重新运行整个onDraw进程吗?

只需回答您的问题:是的,您确实需要使用
invalidate()重新运行
onDraw
进程

我是这样做的:

  • 创建
    Paint
    s的数组列表。您需要能够分配 每个矩形一个,这样您就可以用 正确的颜色。添加您可能需要的默认绘制颜色。因此,如果用户最多只能创建9个矩形,请添加9个相同初始颜色的油漆:

    for (int i = 0; i < MAX_RECTS; i++) {
        paintListName.add(new Paint());
        paintListName.get(i).setColor(Color.BLACK); //Your default color
    }
    
  • 在onDraw
  • 中,应创建每个矩形及其相关颜色:

    canvas.drawRect(rect, paintListName.get(c));
    

    非常感谢您的详细回答。
    canvas.drawRect(rect, paintListName.get(c));