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