Android 在画布上画多次

Android 在画布上画多次,android,canvas,ondraw,Android,Canvas,Ondraw,我在班上的一次练习中遇到了一个小问题。练习是在画布上多次绘制形状。但我只能画一次,当我画另一个时,前一个会被删除。这是我的CustomView代码。figuras是一个形状的链接列表,将来我会保存它们。抽签时,我将从链接列表中删除这些数字 包com.example.AndroidTest import android.content.Context; import android.graphics.Canvas; import android.graphics.Color

我在班上的一次练习中遇到了一个小问题。练习是在画布上多次绘制形状。但我只能画一次,当我画另一个时,前一个会被删除。这是我的CustomView代码。figuras是一个形状的链接列表,将来我会保存它们。抽签时,我将从链接列表中删除这些数字

包com.example.AndroidTest

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Paint.Style;
    import android.text.TextUtils;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Toast;

    import java.util.LinkedList;
公共类CustomView扩展了视图{

private final Paint brush;
private LinkedList<Figures> figuras;
public int id;
private float startX;
private float endX;
private float startY;
private float endY;
Figures fig; // á partida é para mudar para o createFigure
public CustomView(Context context, LinkedList <Figures> figures)
{
    super(context);
    brush = new Paint();
    brush.setStyle(Style.STROKE);
    brush.setColor(Color.WHITE);
    brush.setStrokeWidth(6);
    figuras = figures;
}

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


        createFigure( startX,  startY,  endX,  endY);
        fig.drawFigure(canvas, brush);
        invalidate();

}

public String getString(){
    String joined = TextUtils.join("\n\n", figuras); return joined;
} // criar uma string a copiar o conteudo duma list com o intervalo de uma virgula.


@Override
public boolean onTouchEvent( MotionEvent event) {

    if (event.getAction() == event.ACTION_DOWN) {
        startY = event.getY();
        startX = event.getX();
        endY = event.getY();
        endX = event.getX();
        figuras.add(fig);
        Toast.makeText(getContext(), "" + figuras.size(), Toast.LENGTH_SHORT).show();

    } else if (event.getAction() == event.ACTION_MOVE) {
        endY = event.getY();
        endX = event.getX();
        figuras.getLast().setEndVars(endX, endY);

    }
    return super.onTouchEvent(event);
}

public void createFigure(float startX, float startY, float endX, float endY) {


    switch (id) // aqui crio a figura Fig fig = new line/circle/rect
    {
        case 0:
            fig = new Line(startX, startY, endX, endY);
            break;
        case 1:
            fig = new Circle(startX, startY, endX, endY);
            break;
        case 2:
            fig = new Rectangle(startX, startY, endX, endY);
            break;
    }
    //return fig;
}

public void setID(int aux)
{
    id = aux;
}

public LinkedList<Figures> getArray()
{
    return figuras;
}
私人最终油漆刷;
私人LinkedList figuras;
公共int id;
私人浮动startX;
私有浮动端点;
私人浮星;
私有浮动终端;
图fig;//partidaépara mudar para o CreateFig
公共自定义视图(上下文、链接列表图形)
{
超级(上下文);
刷子=新油漆();
画笔。设置样式(样式。笔划);
画笔。设置颜色(颜色。白色);
刷。设定行程宽度(6);
figuras=数字;
}
@凌驾
受保护的void onDraw(画布)
{
super.onDraw(帆布);
createFigure(startX、startY、endX、endY);
fig.drawFigure(帆布、画笔);
使无效();
}
公共字符串getString(){
String joined=TextUtils.join(“\n\n”,figuras);返回joined;
}//criar uma string a copiar o conteudo duma list com o intervalo de uma virgula。
@凌驾
公共布尔onTouchEvent(运动事件){
if(event.getAction()==event.ACTION\u DOWN){
startY=event.getY();
startX=event.getX();
endY=event.getY();
endX=event.getX();
图。添加(图);
Toast.makeText(getContext(),“”+figuras.size(),Toast.LENGTH\u SHORT.show();
}else if(event.getAction()==event.ACTION\u MOVE){
endY=event.getY();
endX=event.getX();
figuras.getLast().setEndVars(endX,endY);
}
返回super.onTouchEvent(事件);
}
public void createFigure(浮点startX、浮点startY、浮点endX、浮点endY){
开关(id)//aqui crio a figura Fig Fig=新线/圆/矩形
{
案例0:
图=新线(起点、起点、终点、终点);
打破
案例1:
fig=新圆(startX、startY、endX、endY);
打破
案例2:
fig=新矩形(startX、startY、endX、endY);
打破
}
//返回图;
}
公共无效设置ID(内部辅助)
{
id=aux;
}
公共链接列表getArray()
{
返回图形;
}

}

调用
invalidate
后,已绘制的所有内容都将被擦除,并再次调用onDraw。当前,您正在无限循环中绘制,每次使用startY、startX、endY和endX变量的当前值绘制一个图形,然后使所绘制的无效。如果这些变量已更改,则不会再次绘制旧图形

为了绘制新图形和所有旧图形,每次调用onDraw时,您必须迭代
figuras
并再次绘制每个图形。然后,您应该会看到所有添加到
figuras
中的图形,因此所有您想要绘制的图形。像这样:

protected void onDraw(Canvas canvas)
{
   super.onDraw(canvas);
   for(Figures f : figuras) {
      f.drawFigure(canvas, brush);
   }
}
关于性能的另外两个概念。您应该在
ontochevent
中调用
invalidate
,而不是在
onDraw
上调用。这将节省大量的计算能力。目前我打赌你可以用你的手机作为暖手器。 此外,还应在
onTouchEvent
中创建图形。在onDraw中,只执行必要的操作。其他所有内容都应在onDraw的
onDraw
之外