117.info
人生若只如初见

SurfaceView和普通view的区别及简单使用

SurfaceView和普通View的区别主要体现在以下几个方面:

  1. 渲染机制:SurfaceView通过使用独立的绘图线程,可以在后台进行绘图操作,而不会阻塞主线程。而普通的View只能在主线程中进行绘图操作。
  2. 可见性:SurfaceView可以在不可见的情况下继续渲染,而普通的View在不可见时会停止绘制。
  3. 绘制方式:SurfaceView使用双缓冲机制,可以避免闪烁问题,而普通的View在绘制过程中可能会出现闪烁。
  4. 控件层级:SurfaceView位于窗口层级的最顶层,可以覆盖其他View,而普通的View则按照布局层级进行绘制。

使用SurfaceView时,一般需要自定义一个继承自SurfaceView的类,并实现SurfaceHolder.Callback接口,重写方法来控制绘制操作。具体步骤如下:

  1. 创建一个自定义的SurfaceView类,并实现SurfaceHolder.Callback接口。
public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    
    private SurfaceHolder holder;
    
    public MySurfaceView(Context context) {
        super(context);
        init();
    }
    
    public MySurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    
    private void init() {
        holder = getHolder();
        holder.addCallback(this);
    }
    
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // surface创建时调用
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // surface尺寸变化时调用
    }
    
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // surface销毁时调用
    }
    
    public void drawSomething() {
        // 绘制操作
    }
}
  1. 在Activity或Fragment中使用MySurfaceView。
public class MainActivity extends AppCompatActivity {
    
    private MySurfaceView surfaceView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        surfaceView = findViewById(R.id.surface_view);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        
        // 在这里开始绘制
        surfaceView.drawSomething();
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        
        // 在这里停止绘制
    }
}

需要注意的是,绘制操作一般需要在SurfaceHolder.Callback的surfaceCreated方法中开始,在surfaceDestroyed方法中停止。并且,为了避免内存泄漏,需要在Activity或Fragment的生命周期方法中正确地管理SurfaceView的绘制操作。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fece4AzsLAwVRBFE.html

推荐文章

  • MySQL添加数据insert命令详解

    MySQL的INSERT命令用于向数据库表中插入新的数据。它的基本语法如下:
    INSERT INTO table_name (column1, column2, ...)
    VALUES (value1, value2, ......

  • 使用springmvc后事物不起作用的原因

    使用Spring MVC后事物不起作用的原因可能包括以下几点: 事物管理器配置错误:在Spring MVC中,通常使用@EnableTransactionManagement注解启用事物管理。如果缺少...

  • MathCAD入门安装及快速上手使用教程

    MathCAD是一种数学建模和计算软件,可以用于解决数学问题、进行科学计算和数据分析等工作。以下是MathCAD的安装和快速上手使用教程。
    安装MathCAD: 打开Ma...

  • WPF经典教程之StackPanel、WrapPanel、DockPanel布局

    WPF(Windows Presentation Foundation)是一种用于创建富客户端应用程序的技术,提供了多种布局控件来帮助我们构建界面。其中,StackPanel、WrapPanel和DockPan...