【发布时间】:2014-01-19 05:31:52
【问题描述】:
我创建了一个路径对象,如下所示,它绘制不同的形状。不同的按钮响应在画布上绘制不同的形状。每次将按钮调用到数组列表时,我都会尝试保存路径,并在每次增加数组列表时重绘画布上的所有路径。
public class DrawImage extends SurfaceView {
ArrayList<Path> paths = new ArrayList<Path>();
Path path = new Path();
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if (MainActivity.isRectangle) {
path.moveTo(1, 1);
path.lineTo(90, 1);
path.lineTo(90, 60);
path.lineTo(1, 60);
path.close();
paintColor.setColor(Color.RED);
paintColor.setStrokeWidth(2);
paintColor.setStyle(Paint.Style.STROKE);
paths.add(path);
for (Path p : paths) {
canvas.drawPath(p, paintColor);
}
}
if (MainActivity.isTriangle) {
path.moveTo(0, 40);
path.lineTo(50, 0);
path.lineTo(50, 50);
path.lineTo(50, 50);
path.lineTo(0, 40);
path.close();
paintColor.setColor(Color.RED);
paintColor.setStrokeWidth(2);
paintColor.setStyle(Paint.Style.STROKE);
paths.add(path);
for (Path p : paths) {
canvas.drawPath(p, paintColor);
}
}
}
这是我的主要活动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dI = new DrawImage(this);
rectbutton = (Button) findViewById(R.id.pointerbutton);
RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.relativeLayout);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
// add here other layout params rules to make your
// custom view stay below the buttons
lp.addRule(RelativeLayout.BELOW, R.id.rectbutton);
dI.setLayoutParams(lp);
mainLayout.addView(dI);
rectbutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
isTriangle = false;
isRectangle = true;
isCircle= false;
isParallelogram = false;
isTapezium = false;
dv.invalidate();
}// onclick
});
trianglebutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
isTriangle = true;
isRectangle = false;
isCircle= false;
isParallelogram = false;
isTapezium = false;
dv.invalidate();
}// onclick
});
问题:两个路径对象重叠,第二次调用矩形按钮或三角形按钮时,没有出现新的路径对象。
请指教谢谢。
DrawImage 类的修正
public class DrawImage extends SurfaceView {
Paint paintColor = new Paint();
Path path = new Path();
Canvas canvas;
float x = 0, y = 0;
public static ArrayList<Path> paths = new ArrayList<Path>();
public DrawImage(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Paint background = new Paint();
background.setColor(Color.WHITE);
canvas.drawARGB(255, 255, 255, 255);
paintColor.setColor(Color.GRAY);
paintColor.setStrokeWidth(2);
paintColor.setStyle(Paint.Style.STROKE);
for (Path p : paths) {
canvas.drawPath(p, paintColor);
}
}
public void addRectangle() {
Path path = new Path();
path.moveTo(x+1, y+1);
path.lineTo(x+90, y+1);
path.lineTo(x+90, y+60);
path.lineTo(x+1, y+60);
path.close();
paths.add(path);
}
}
对 mainActivity 的修改
layout.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = event.getX();
y = event.getY();
et1.setText(String.valueOf(x));
et2.setText(String.valueOf(x));
break;
}
dv.invalidate();
return true;
}
});
}
【问题讨论】:
-
嗯,没有代码可以将任何东西放入数组列表中,所以它当然是空的。
-
@Ridcully 我已经对问题进行了修改。
-
我的印象是您不理解您正在使用的代码。
ArrayList<Path> paths你在你的课堂上永远不会添加任何东西,所以当你稍后迭代它时,什么都不会被渲染。 -
@Ridcully 对不起,我正在自学中。在我的代码中,“paths.add(path);”将路径添加到我已声明的数组列表。所以我用的方法不对?我做了一个调试,我的数组是空的。如果可能的话,你能给我一个添加路径到数组列表的例子吗?或纠正我?谢谢
-
对不起,我错过了那行。尽管如此,这是一种非常奇怪的方法。在我的回答中,我会尝试提出更好的方法。
标签: android arraylist path android-canvas draw