Android SurfaceView & View 的区别

Android SurfaceView & View 的区别

Android中的SurfaceView和View是两种常用的UI组件,它们在渲染和绘制方面有一些区别:

渲染方式:

  • View:View使用UI线程进行渲染,即在主线程中进行绘制操作。当View需要进行重绘时,会触发UI线程的绘制流程。
  • SurfaceView:SurfaceView使用双缓冲机制,它有自己的独立绘制线程(SurfaceHolder.Callback中的SurfaceHolder.Callback.surfaceCreated()方法中创建),称为渲染线程。渲染线程独立于UI线程,可以在后台进行绘制操作,从而避免了在UI线程中执行复杂的绘制任务而导致的卡顿问题。

绘制方式:

  • View:View的绘制是在UI线程中进行的,即在View的onDraw()方法中进行绘制操作。它使用Canvas对象进行绘制,并在需要时通过调用invalidate()方法来触发重绘。
  • SurfaceView:SurfaceView的绘制是通过SurfaceHolder对象进行的。我们可以在渲染线程中通过SurfaceHolder获取Canvas对象,并使用Canvas进行绘制操作。

占用资源:

  • View:由于View是直接在UI线程中进行绘制,因此它对系统资源的占用相对较少。
  • SurfaceView:SurfaceView使用了独立的渲染线程,因此会占用更多的系统资源。这是因为SurfaceView需要在后台维护一个独立的绘制表面(Surface),而且需要将渲染线程与UI线程同步。

适用场景:

  • View:View适用于简单的静态UI元素和简单的动画效果,适合用于常规的界面布局和交互。
  • SurfaceView:SurfaceView适用于需要进行复杂绘制、频繁更新、或实时渲染的场景,例如游戏引擎、视频播放器、摄像头预览等。由于它使用了独立的渲染线程,可以在后台进行高效的绘制操作,提供更流畅的用户体验。

总结起来,SurfaceView和View在渲染和绘制方面有所不同。SurfaceView适用于需要高性能、实时绘制的场景,而View则适用于常规的UI布局和简单的动画效果。在选择使用时,需要根据具体的需求和性能要求来决定使用哪种UI组件。

代码举例说明

下面是一些简单的代码示例,展示了如何在Android中使用SurfaceView和View:

  1. 使用View进行绘制:
public class CustomView extends View {
    // 构造函数
    public CustomView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 在View上进行绘制操作
        canvas.drawColor(Color.RED);
        // 绘制其他图形、文本等
    }
}

在这个示例中,我们创建了一个自定义的View类,并重写了onDraw()方法。在onDraw()方法中,我们使用Canvas对象进行绘制操作,例如通过drawColor()方法绘制红色背景。你可以在此方法中进行更多的绘制操作,如绘制图形、文本等。

  1. 使用SurfaceView进行绘制:
public class CustomSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder surfaceHolder;

    // 构造函数
    public CustomSurfaceView(Context context) {
        super(context);
        // 获取SurfaceHolder对象
        surfaceHolder = getHolder();
        // 设置SurfaceHolder回调
        surfaceHolder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // 在Surface创建时开始绘制线程
        new DrawThread().start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // Surface发生变化时的处理
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // 在Surface销毁时停止绘制线程
        boolean retry = true;
        while (retry) {
            try {
                // 停止线程
                thread.join();
                retry = false;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private class DrawThread extends Thread {
        @Override
        public void run() {
            Canvas canvas = null;
            try {
                // 获取Canvas对象
                canvas = surfaceHolder.lockCanvas();
                if (canvas != null) {
                    // 在Canvas上进行绘制操作
                    canvas.drawColor(Color.BLUE);
                    // 绘制其他图形、文本等
                }
            } finally {
                if (canvas != null) {
                    // 解锁并提交Canvas
                    surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }
        }
    }
}

在这个示例中,我们创建了一个自定义的SurfaceView类,并实现了SurfaceHolder.Callback接口。在构造函数中,我们获取SurfaceHolder对象并设置回调。在回调方法中,我们在surfaceCreated()方法中启动绘制线程,并在surfaceDestroyed()方法中停止绘制线程。在绘制线程中,我们使用Canvas对象进行绘制操作,例如通过drawColor()方法绘制蓝色背景。

这些示例展示了在Android中使用View和SurfaceView进行绘制的基本用法。通过重写onDraw()方法或创建绘制线程,我们可以在View或SurfaceView上进行自定义的绘制操作。根据实际需求,可以在这些方法中添加更多的绘制代码,以实现所需的绘制效果。

你可能感兴趣的:(android)