在onDraw()方法之外在画布上绘制内容

6
这是我的OnDraw()方法。
void onDraw(Canvas canvas) {
    mCanvas = canvas;
    //invalidate();
    int x = 0;
    Iterator<Letter> it = mNextUpQueue.iterator();
    while(it.hasNext()){
        mCanvas.drawBitmap(it.next().getNext(), mNextUpCoordinates.get(x).x, mNextUpCoordinates.get(x).y, mPaint);
        mCanvas.drawBitmap(mAvailableLetters.get(x).getNotPressed(), mAvailableLettersCoordinates.get(x).x, mAvailableLettersCoordinates.get(x).y, mPaint);
        x++;
    }
}

我已将canvas设置为全局变量mCanvas。但是,如果我试图在onDraw()方法之外的地方绘制mCanvas,就会出现错误。这是因为我做错了什么还是canvas必须始终从onDraw方法内部使用?

2个回答

8
请不要引用传递的Canvas引用,因为它仅在onDraw(Canvas)方法调用期间有效。
我建议仔细阅读http://developer.android.com/guide/topics/graphics/2d-graphics.html#draw-with-canvas。其中解释了可能的使用方式:
1. 在onDraw(Canvas)方法调用时向提供的Canvas进行操作。此操作在UI线程中完成,因此不应尝试进行任何复杂的操作。 2. 创建自己的Canvas并对其进行操作。这对于在另一个线程中准备位图,然后将位图绘制到onDraw(Canvas)方法给定的Canvas中非常有用。 3. 使用SurfaceView,并通过lockCanvas()方法从其中获取Canvas对象。

2
您可以使用 invalidate(); 来调用 onDraw() 并根据您的绘图逻辑绘制画布。 示例
public class ThumbnailImage extends android.support.v7.widget.AppCompatImageView {

    public static final int FALSE = 0, TRUE = 1, NOT_SET = 2;
    private int drawingStatus;     

    public ThumbnailImage(Context context) {
        super(context);
        init();
    }

    public ThumbnailImage(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ThumbnailImage(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        ...
        drawingStatus = NOT_SET;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (drawingStatus != NOT_SET) {
            if (drawingStatus == TRUE) {
               ...
            } else {
               ...
            }
        }
    }

    public void setDrawingStatus(int drawingStatus) {
        this.drawingStatus = drawingStatus;
        invalidate();
    }

}

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