我正在从另一个事件中读取一系列点并从这些点创建一条路径。我有一个名为“DrawCanvas”的自定义 View ,它扩展了 View。目前代码正在投影一个空白的白色 Canvas 。有人可以帮我理解为什么 Canvas 没有绘制路径吗?
PreviewActivity.java
public class Preview extends Activity{
Canvas newCanvas = new Canvas();
MyPointsList object;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getIntentData();
Path path = new Path();
if(object.getArrayList().get(0) != null){
for(int i = 0; i < object.getArrayList().size(); i++){
path.moveTo(object.getMyPoint(i).getX(), object.getMyPoint(i).getY());
path.lineTo(object.getMyPoint(i).getX(), object.getMyPoint(i).getY());
}
}
FrameLayout canvas1 = new FrameLayout(this);
DrawCanvas view;
view = new DrawCanvas(Preview.this);
view.onDraw(newCanvas, path);
canvas1.addView(view);
setContentView(canvas1);
}
public void getIntentData(){
Intent i = this.getIntent();
if(i.hasExtra("parcel")){
Bundle b = getIntent().getExtras();
object = b.getParcelable("parcel");
if(object != null){
Log.d("Debug", object.getArrayList().get(5).getX() + " " + object.getArrayList().get(5).getY());
}
else if(object == null){
Log.d("Debug", "Object is equal to Null");
}
}
}
Canvas .java
public class DrawCanvas extends View {
public DrawCanvas(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public void onDraw(Canvas canvas, Path path){
super.onDraw(canvas);
canvas.drawARGB(255,255,255,255);
Paint black = new Paint();
black.setColor(Color.BLACK);
black.setStyle(Paint.Style.STROKE);
black.setStrokeJoin(Paint.Join.ROUND);
black.setStrokeCap(Paint.Cap.ROUND);
black.setStrokeWidth(3);
canvas.drawPath(path, black);
}
}
最佳答案
您不会覆盖正确的 onDraw(Canvas canvas)
自定义 View 中的方法。如我所见,您传递给 super onDraw
一 block 空的 Canvas 。然后,您正在添加路径,但不要使 View 无效以绘制您的修改。
并且,其他阻止您的结果可见的事情,您添加 DrawView
调用您的onDraw
后.我的猜测是, View 将“重置”其生命周期(onMeasure
-> onLayout
-> onDraw
...),但具有基本初始化。 (我不确定)。因此,您的所有修改都不会被存储。
此外,您不应该在绘制某些东西时分配新对象。每次 View 无效时,这将消耗大量内存。
因此,尝试初始化 Paint
开始时的对象:
private Paint paint;
private Path path;
public DrawCanvas(Context c) {
super(c);
init();
}
public DrawCanvas(Context c, AttributesSet a) {
super(c, a);
init();
}
private void init() {
// create your paint object
paint = new Paint();
paint.setColor(Color.BLACK);
...
}
关注您的
Path
初始化:public void setPath(Path path) {
// store your new path
this.path = path;
// invalidate the view to call onDraw()
invalidate();
}
最后,覆盖真正的
onDraw
方法并绘制您的逻辑:@Override
public void onDraw(Canvas canvas) {
if (paint == null || path == null)
return;
canvas.drawPath(path, paint);
}
现在您可以设置新的
Path
在 onCreate()
如下:setContentView(canvas1);
DrawCanvas draw = new DrawCanvas(this);
canvas1.addView(draw);
draw.setPath(path);
如果您将“重”处理作为 Path 对象,您应该考虑调用
postInvalidate()
因为invalidate()
将在主线程中调用。
关于android-canvas - 安卓 : How to draw an array of points to a canvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14201369/