在SurfaceView中绘制画布

时间:2015-09-05 13:52:53

标签: android android-canvas surfaceview

我只想在SurfaceView上绘制并修改了here

中的一些示例代码

如果我直接在循环中绘制它可以工作,但是当我调用draw方法时它不起作用。任何想法可能是什么问题? 但这是我在其他教程中看到的,所以它应该工作。 当然我可以使用draw1。但我想知道为什么onDraw在这里不起作用?

public class TestSurefaceView extends Activity {
MySurfaceView mySurfaceView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mySurfaceView = new MySurfaceView(this);
    setContentView(mySurfaceView);
}
class MySurfaceView extends SurfaceView implements Runnable{
    Thread thread = null;
    SurfaceHolder surfaceHolder;
    volatile boolean running = false;
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    Random random;
    public MySurfaceView(Context context) {
        super(context);
        surfaceHolder = getHolder();
        random = new Random();
    }
    @Override
    public void run() {
        while(running){
            if(surfaceHolder.getSurface().isValid()){
                Canvas canvas = surfaceHolder.lockCanvas();
                //draw(canvas); // does not work
                draw1(canvas); // works
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
    private void draw1(Canvas canvas){
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(3);
        int w = canvas.getWidth();int h = canvas.getHeight();
        int x = random.nextInt(w-1);
        int y = random.nextInt(h-1);
        int r = random.nextInt(255);
        int g = random.nextInt(255);
        int b = random.nextInt(255);
        paint.setColor(0xff000000 + (r << 16) + (g << 8) + b);
        canvas.drawPoint(x, y, paint);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        draw1(canvas);
    }
}
}

1 个答案:

答案 0 :(得分:0)

SurfaceViews有两个部分,Surface和View。 onDraw()用于绘制视图。 Surface的要点是它是View UI层下面的一个单独的图层,因此您可以在其上绘制而不会干扰通常的View invalidate / redraw周期。

很难说为什么它不起作用&#34;当你还没有解释它是什么时候没有发生。定义onDraw()方法时的一个常见问题是,如果View UI获得无效,它将调用方法在View上绘制。由于视图位于Surface的顶部,因此在View上绘制的任何内容都会遮挡Surface,因此,例如不透明的背景会阻止Surface上发生的任何事情可见。

我通常建议您不要将SurfaceView子类化,因为这样做没有价值,而良好的OOP实践会鼓励组合而不是继承。