Android:运行时更改矩形的颜色

3

我有一个LinearLayout,并且我有一个自定义视图:

public class myView extends View  
{
    Rect rects = new Rect(30,30,80,80); 
    Canvas myCanvas;
    @Override
    public void onDraw(Canvas canvas)     
    {
         myCanvas = canvas;
         paint.setColor(Color.RED);
         canvas.drawRect(rects, paint);

    }
    void changeColor()
    {
        paint.setColor(Color.BLUE);
        myCanvas.drawRect(rects, paint);
        myCanvas.invalidate();
    }
}

在MainActivity中,我有以下内容:

LinearLayout lv = (LinearLayout) View.inflate(this, R.layout.activity_main, null);
drawView = new myView(this);
lv.addView(drawView); 
setContentView(lv);
Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener()
{
        @Override
        public void onClick(View v) {
            drawView.changeColor();
        }  
});

点击按钮后,我想通过调用changeColor函数来改变矩形的颜色。但是会创建一个新的矩形出现在其他位置!请问你能帮助我解决吗?
1个回答

8
你两次调用了“drawRect”方法(在刷新视图之前和在“onDraw”方法中)。此外,无需存储“Canvas”的引用。
将所需颜色保存在一个变量中,更改它并刷新视图。
public class myView extends View {

    private Color color = Color.RED;

    Rect rects = new Rect(30,30,80,80); 

    @Override
    public void onDraw(Canvas canvas) {
         paint.setColor(color);
         canvas.drawRect(rects, paint);
    }

    void changeColor() {
        color = Color.BLUE
        invalidate();
    }
}

谢谢。如果我想要一开始创建多个形状,然后通过点击更改它们的颜色,那么我应该在什么时候首次绘制它们?如果我把所有东西都放在OnDraw里面,那么每次invalidate时它们都会被重新绘制,而我可能只需要改变其中一个的颜色。 - Sara
实现这种情况取决于几个因素,但如果形状的数量不太大,我想你可以使用颜色和矩形的数组。您需要从0迭代到rects.length,并在每次迭代中调用setColor和drawRect。 - ssantos
但如果它很大,这不是一个好方法。对吗?如果调用canvas.drawRect(rects, paint);而不调用invalidate会怎样? - Sara
好的,但是用户应该点击他想要改变颜色的正方形吗?抱歉,我感觉我没有完全理解你想要实现的目标。 - ssantos
让我们在聊天中继续讨论 - Sara
显示剩余3条评论

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