Android  Surfaceview的绘制与应用

发布时间 - 2026-01-11 02:20:57    点击率:

Android  Surfaceview的绘制与应用

一.surfaceview与view的区别

Android 提供了view进行视图的绘制,可以满足大部分的会图需求,但在有些时候却是心有余而力不足。我们知道,view通过刷新来绘制视图。android系统通过vsync信号来进行屏幕的绘制。刷新的时间间隔为16毫秒。如果在16毫秒内完成了索要刷新的绘制操作,那么在视觉效果上就不会产生卡顿的感觉。如果逻辑操作过多,频繁刷新就会造成界面的卡顿。

  对于这一问题,Android提供了surfaceview来解决。它可以说是view的孪生兄弟,但他与view还是不同的,他与view的区别主要在一下几点:

    view 主要是用于主动更新的情况下,而surfaceview主要是用于被动更新的情况下,列如频繁的刷新。

    view主要是通过主线程对界面进行刷新,而surfaceview主要是通过子线程对view进行刷新。

    view在绘制时没有使用双缓冲机制,而surfaceview的底层是使用了双缓冲机制。

二.surfaceview的使用

surfaceview虽然使用比较复杂,但是他有一套使用的模板,这就使得他使用起来比较简单了,通常情况下,我们将会使用如下的方法步骤来实现surfaceview的创建:

   创建自定义的surfaceview,继承自surfaceview 。并实现连个接口surfaceholder.Callback和Runnable接口。

public class MySurfaceView extends SurfaceView implements 
SurfaceHolder.Callback, Runnable 

看如下方法,分别对应了surfaceview的创建改变和销毁。

@Override
public void surfaceCreated(SurfaceHolder holder) {

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

我们来看看他的模板:

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {

  private SurfaceHolder mHolder;
  private Canvas mCanvs;
  private Boolean mIsDrawing;


  public MySurfaceView(Context context) {
    this(context, null);
  }

  public MySurfaceView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  private void init() {
    mHolder = getHolder();
    mHolder.addCallback(this);
    setFocusable(true);
    setFocusableInTouchMode(true);
    this.setKeepScreenOn(true);
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    mIsDrawing = true;
    new Thread(this).start();
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    mIsDrawing = false;
  }

  @Override
  public void run() {
    while (mIsDrawing) {
      draw();
    }
  }


  public void draw() {
    try {
      mCanvs = mHolder.lockCanvas();
    } catch (Exception e) {

    } finally {
      mHolder.unlockCanvasAndPost(mCanvs);
    }
  }
}

以上的模板基本满足大部分surfaceview的绘图需求,唯一要注意的是,要把

mHolder.unlockCanvasAndPost(mCanvs);

放到finally中以保证每次都能提交修改。

只要我们在run方法中不断的绘制就可以实现view的及时刷新,当然我们也可以在run方法中sleep减少资源的消耗。这个值一般在50到100毫秒之间。

以上就是Android  Surfaceview的绘制与应用的详细介绍,关于Android View的重写本站很多资料大家可以按需要查询,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Android  # Surfaceview的绘制与应用  # surfaceveiw的重写  # android surfaceView实现播放视频功能  # android使用surfaceview+MediaPlayer播放视频  # Android SurfaceView预览变形完美解决方法  # Android使用SurfaceView实现飘赞动画  # Android截屏SurfaceView黑屏问题的解决办法  # Android SurfaceView拍照录像实现方法  # Android系统view与SurfaceView的基本使用及区别分析  # 主要是  # 情况下  # 的是  # 这一  # 就会  # 却是  # 将会  # 都能  # 心有余而力不足  # 但在  # 但他  # 要把  # 这就  # 要注意  # 希望能  # 来看看  # 自定义  # 详细介绍  # 几点  # 重写 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  Laravel如何实现多对多模型关联?(Eloquent教程)  nginx修改上传文件大小限制的方法  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  Swift中循环语句中的转移语句 break 和 continue  如何快速启动建站代理加盟业务?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何快速建站并高效导出源代码?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  浅析上传头像示例及其注意事项  Laravel如何处理文件下载请求?(Response示例)  Laravel如何使用Livewire构建动态组件?(入门代码)  手机网站制作与建设方案,手机网站如何建设?  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel如何配置Horizon来管理队列?(安装和使用)  Java遍历集合的三种方式  Bootstrap整体框架之JavaScript插件架构  Laravel如何生成URL和重定向?(路由助手函数)  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  如何快速查询网址的建站时间与历史轨迹?  如何快速配置高效服务器建站软件?  Linux安全能力提升路径_长期防护思维说明【指导】  如何用AI帮你把自己的生活经历写成一个有趣的故事?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  Laravel storage目录权限问题_Laravel文件写入权限设置  如何在阿里云高效完成企业建站全流程?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  高端企业智能建站程序:SEO优化与响应式模板定制开发  javascript读取文本节点方法小结  如何在阿里云服务器自主搭建网站?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  大型企业网站制作流程,做网站需要注册公司吗?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  制作电商网页,电商供应链怎么做?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel如何创建自定义Facades?(详细步骤)  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  中国移动官方网站首页入口 中国移动官网网页登录  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布