android-canvas - 安卓 : How to draw an array of points to a canvas

标签 android-canvas android-view ondraw

我正在从另一个事件中读取一系列点并从这些点创建一条路径。我有一个名为“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);
}

现在您可以设置新的PathonCreate()如下:
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/

相关文章:

android - 在android中旋转90度

android - 根据用户触摸沿其中心旋转 Canvas - Android

java - 在 Android 的 View 中创建透明圆形切口

java - 绘图前调整 View 大小

android - 通过在android中触摸在 Canvas 中拖动多个图像

android - 有没有一种简单的方法可以在 Android View 的顶部和底部添加边框?

android - 如何将 TextView 的矩形修改/更改为其他内容

java - 自定义 ondraw 方法不起作用

安卓 : click/touch event not working after canvas translate

java - 当 Canvas 移动到显示边框时,不会调用 onDraw()