Android:如何将点数组绘制到画布上

4
我正在从另一个活动中读取一组点,并从这些点创建路径。我有一个名为“DrawCanvas”的自定义视图,它扩展了View。目前,代码投射出一个空白的白色画布。能否有人帮助我理解为什么画布没有绘制路径?
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");  
        }
    }       
}

DrawCanvas.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);
}

}

1个回答

1
你没有覆盖自定义视图中正确的onDraw(Canvas canvas)方法。据我所见,你将一个空画布传递给了超类的onDraw。然后,你添加了你的路径,但没有使视图无效以绘制你的修改。
另外,阻止你的结果可见的另一件事是,在调用你的onDraw之后添加了DrawView。我的猜测是,视图将“重置”其生命周期(onMeasure -> onLayout -> onDraw...),但带有其基本初始化。(我对此并不确定)。因此,所有你的修改都不会被存储。
此外,你不应该在绘制时分配新对象。每次视图失效时,这将消耗太多内存。
因此,请尝试在开始时初始化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);
}

现在你可以在onCreate()中设置你的新Path,方法如下:
setContentView(canvas1);

DrawCanvas draw = new DrawCanvas(this);
canvas1.addView(draw);
draw.setPath(path);

如果您的Path对象有“重”处理,您应该考虑调用postInvalidate(),因为invalidate()将在主线程中被调用。

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