SurfaceView丢失了初始绘图。双缓冲初始化?

时间:2014-03-18 08:58:51

标签: android performance animation graphics surfaceview

我使用SurfaceView来驱动精灵。

为了提高性能,我只是部分地重绘canvas,所以我用脏矩形锁定Canvas。一般来说,它运作良好,但SurfaceView方法中surfaceCreated丢失了初始绘图。

我认为它与SurfaceView内部双重缓冲相关。

如何正确初始化SurfaceView

的任何想法
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class TestView extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = TestView.class.getSimpleName();
    SurfaceHolder holder;

    public TestView(Context context) {
        super(context);
        holder = getHolder();
        holder.addCallback(this);
        setFocusable(true);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        drawBg();
        drawPoint(100, 120);
    }

    private void drawBg() {
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            synchronized (holder) {
                canvas.drawRGB(255, 128, 128);
                Paint paint = new Paint();
                paint.setColor(Color.GREEN);
                canvas.drawCircle(100, 100, 10, paint);
            }
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }

    private void drawPoint(int x, int y) {
        int radius = 10;
        Rect dirty = new Rect(x - radius, y - radius, x + radius, y + radius);
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas(dirty);
            synchronized (holder) {
                Paint paint = new Paint();
                paint.setColor(Color.BLUE);
                canvas.drawCircle(x, y, radius, paint);
            }
        } finally {
            if (canvas != null) {
                holder.unlockCanvasAndPost(canvas);
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {}

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {}


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            drawPoint((int) event.getX(), (int) event.getY());
        }
        return super.onTouchEvent(event);
    }
}

0 个答案:

没有答案