【问题标题】:how do i change specific rect color on a canvas in android?如何在 android 的画布上更改特定的矩形颜色?
【发布时间】:2013-02-24 07:14:47
【问题描述】:

当我触摸屏幕时,我一直在尝试更改矩形数组中特定矩形的颜色,但它似乎不起作用,这是我的代码:

public Paint blue = new Paint();
RandomColorGen rc;
ArrayList<Integer> colors = RandomColorGen.ColorList(5);
Random rand = new Random();
int columns = 50;
int rows = 50;
Rect square[][] = new Rect[rows][columns];

public boolean isTouched;
public Canvas canvas;

    @Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    this.canvas = canvas;

    for (int x = 0; x < rows; x++) {
        for (int y = 0; y < columns; y++) {

            square[x][y] = new Rect();

            blue.setColor(colors.get(rand.nextInt(colors.size())));
            blue.setStyle(Paint.Style.FILL);

            square[x][y].set(0, 0, (canvas.getWidth() - 10) / rows,
                    ((canvas.getHeight() - 100) / columns));
            square[x][y].offsetTo(x * ((canvas.getWidth() - 10) / rows), y
                    * ((canvas.getHeight() - 100) / columns));

            canvas.drawRect(square[x][y], blue);


        }
    }
    if(isTouched){
        blue.setColor(colors.get(rand.nextInt(colors.size())));
        blue.setStyle(Paint.Style.FILL);
        canvas.save();
        canvas.clipRect(square[1][1]);
        canvas.drawRect(square[1][1], blue);

        canvas.restore();

    }

}

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        isTouched = true;


        break;
    }

    return true;

}

colors.get() 是一个颜色数组列表。我采取了错误的方法吗?

【问题讨论】:

    标签: java android colors grid android-canvas


    【解决方案1】:

    在执行 onTouch 操作后如何调用绘制函数...

    OnTouch 动作是第一个动作,那么如何调用 Paint() 函数呢?

    【讨论】:

      【解决方案2】:

      我刚刚测试了你的代码,它可以工作,但有几点值得一提:

      • 在绘图期间分配对象是一种非常糟糕的行为(特别是在分配 50*50 时)!如果您想实现与现在相同的行为,请考虑将分配代码移至构造函数并在 onDraw() 方法中更改矩形的位置。
      • 您对onTouchEvent()的用法不完整,只要用户没有举手,您需要将isTouched设为true,可以这样做:

        @Override
        public boolean onTouchEvent(MotionEvent event) {
        
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            isTouched = true;
        
        
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            isTouched = false;
            break;
        
        }
        invalidate();
        return true;
        

        }

      • 还可以在每次收到 TouchEvent 时使用 invalidate()

      • 请求布局

      【讨论】:

      • 我尝试将它移动到构造函数,我得到一个 nullpointerexception,它说 square[x][y].set(0, 0, (canvas.getWidth() - 10) / rows, ( (canvas.getHeight() - 100) / 列));
      • 另外,我只想改变一个矩形颜色,特别是方形[1][1]。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多