Android之SurfaceView使用总结

[Android] SurfaceView使用实例 同样,先上效果图如下: 效果图中,抛物线的动画即是由SurfaceView实现的。底部栏中的文字翻转详情相关帖子: [Android] 文字翻转动画的实现 需求: 1.实现抛物线动画    1.1 设计物理模型,能够根据时间变量计算出某个时刻图片的X/Y坐标。    1.2 将图片高频率(相比于UI线程的缓慢而言)刷新到界面中。这儿需要实现将脏界面清屏及刷新操作。 2 阅读详情


http://www.cnblogs.com/devinzhang/archive/2012/02/03/2337559.html




Android之SurfaceView使用总结

1.概念

      SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图。它的特性是:可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。

2.实现方法

1)实现步骤

    a.继承SurfaceView

    b.实现SurfaceHolder.Callback接口

2)需要重写的方法

复制代码
(1)public void surfaceChanged(SurfaceHolder holder,int format,int width,int height){}  //在surface的大小发生改变时激发

(2)public void surfaceCreated(SurfaceHolder holder){}  //在创建时激发,一般在这里调用画图的线程。

(3)public void surfaceDestroyed(SurfaceHolder holder) {}  //销毁时激发,一般在这里将画图的线程停止、释放。
复制代码

3)SurfaceHolder

  SurfaceHolder,surface的控制器,用来操纵surface。处理它的Canvas上画的效果和动画,控制表面,大小,像素等。
几个需要注意的方法:

复制代码
(1)、abstract void addCallback(SurfaceHolder.Callback callback);
// 给SurfaceView当前的持有者一个回调对象。
(2)、abstract Canvas lockCanvas();
// 锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
(3)、abstract Canvas lockCanvas(Rect dirty);
// 锁定画布的某个区域进行画图等..因为画完图后,会调用下面的unlockCanvasAndPost来改变显示内容。
// 相对部分内存要求比较高的游戏来说,可以不用重画dirty外的其它区域的像素,可以提高速度。
(4)、abstract void unlockCanvasAndPost(Canvas canvas);
// 结束锁定画图,并提交改变。
复制代码

4)总结整个过程

  继承SurfaceView并实现SurfaceHolder.Callback接口 ----> SurfaceView.getHolder()获得SurfaceHolder对象 ---->SurfaceHolder.addCallback(callback)添加回调函数---->SurfaceHolder.lockCanvas()获得Canvas对象并锁定画布----> Canvas绘画 ---->SurfaceHolder.unlockCanvasAndPost(Canvas canvas)结束锁定画图,并提交改变,将图形显示。

下面是一个完整的案例:

复制代码
public class ViewTest extends Activity {
    @Override
      public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(new MyView(this));
      }
     //视图内部类
      class MyView extends SurfaceView implements SurfaceHolder.Callback
      {
         private SurfaceHolder holder;
         private MyThread myThread; 
         public MyView(Context context) {
             super(context);
             // TODO Auto-generated constructor stub
             holder = this.getHolder();
             holder.addCallback(this);
             myThread = new MyThread(holder);//创建一个绘图线程
         }
  
         @Override
         public void surfaceChanged(SurfaceHolder holder, int format, int width,
                  int height) {
             // TODO Auto-generated method stub
               
         }
  
         @Override
         public void surfaceCreated(SurfaceHolder holder) {
              // TODO Auto-generated method stub
             myThread.isRun = true;
             myThread.start();
        }
  
        @Override
         public void surfaceDestroyed(SurfaceHolder holder) {
            // TODO Auto-generated method stub
            myThread.isRun = false;
        }
      }
      //线程内部类
      class MyThread extends Thread
      {
          private SurfaceHolder holder;
          public boolean isRun ;
          public  MyThread(SurfaceHolder holder)
          {
              this.holder =holder; 
              isRun = true;
          }
          @Override
          public void run()
          {
              int count = 0;
              while(isRun)
              {
                  Canvas c = null;
                  try
                  {
                      synchronized (holder){
                        c = holder.lockCanvas();//锁定画布,一般在锁定后就可以通过其返回的画布对象Canvas,在其上面画图等操作了。
                    c.drawColor(Color.BLACK);//设置画布背景颜色
                    Paint p = new Paint(); //创建画笔
                    p.setColor(Color.WHITE);
                    Rect r = new Rect(100, 50, 300, 250);
                    c.drawRect(r, p);
                    c.drawText("这是第"+(count++)+"秒", 100, 310, p);
                    Thread.sleep(1000);//睡眠时间为1秒
                  }
              }
              catch (Exception e) {
                  e.printStackTrace();
              }
              finally
              {
                   if(c!= null)
                 {
                   holder.unlockCanvasAndPost(c);//结束锁定画图,并提交改变。
                }
           }
         }
       }
     }
  }
复制代码
Android中SurfaceView使用详解 绘制的时候,在surfaceCreated()方法中开启子线程进行绘制,而子线程使用一个while(mIsDrawing)的循环来不停的进行绘制,在绘制的逻辑中通过lockCanvas()方法获取Canvas对象进行绘制,通过unlockCanvasAndPost(mCanvas)方法对画布内容进行提交。在我们的draw()方法每一次更新所耗费的时间是不确定的。在自定义的MySurfaceView的构造方法中,需要对SurfaceView进行初始化,包括SurfaceHolder的初始化、画笔的初始化等。 阅读详情

相关推荐

SurfaceView使用详解

什么是SurfaceView你可以把View理解为一个经过系统优化的,可以用来高效的执行一些帧数比较低动画的对象,它具有特定的使用 场景,比如有一些帧数较低的游戏就可以使用它来完成:贪吃蛇、俄罗斯方块、棋牌类等游戏,因为这些游戏执行的帧数都很低。但是如果是一些实时类的游戏,如 射击游戏、塔防游戏、RPG游戏等就没办法使用View来做,因为它的帧数太低了,会导致动画执行不顺畅。所以我们需要一个能自己控

susr154的博客 921

安卓surfaceview的使用方式

surfaceview内部机制和外部层次结构在安卓开发中,我们经常会遇到一些需要高性能、高帧率、高画质的应用场景,例如视频播放、游戏开发、相机预览等。这些场景中,我们需要直接操作图像数据,并且实时地显示到屏幕上。view组件是在主线程中进行绘制的,如果绘制过程耗时过长或者频繁刷新,可能会导致主线程阻塞,影响用户交互和界面响应。view组件在绘制时没有使用双缓冲机制,也就是说每次绘制都是直接在屏幕上进行的,这可能会导致绘制过程中出现闪烁或者撕裂的现象。

Makenna's World 5518

Android中的SurfaceView

是 Android 中用于动态图像显示的高效组件,它通过Surface和提供了一种简单而强大的方法来在屏幕上绘制图像。理解的工作原理对于开发涉及视频播放、游戏渲染或相机预览的 Android 应用非常重要。

bai915290475的博客 1290

史上最全SurfaceView使用讲解

1、View主要适用于主动更新的情况下,而SurfaceView主要适用于被动更新,例如频繁地刷新。 2、View 在主线程中对画面进行刷新,而 SurfaceView 通常会通过一个子线程来进行页面的刷新。 3、View 在绘图时没有使用双缓冲机制,而 SurfaceView 在底层实现机制中就已经实现了双缓冲机制。总结,如果需要频繁刷新,或者刷新时数据处理量比较大,那么可以考虑使用 SurfaceView 。 kotlin逻辑文件 1、通过 SurfaceHolder 添加 Surf

我想月薪过万的博客 3266

Android SurfaceView的基本使用

一、为什么要SurfaceView 大多数情况下我们的自定义View都会选择去继承View或ViewGroup来实现,但是为什么系统还要为我们提供一个SurfaceView呢? 首先我们知道View类如果需要更新视图,必须我们主动的去调用invalidate()或者postInvalidate()方法来再走一次onDraw()完成更新。但是呢,Android系统规定屏幕的刷新间隔为16ms,如果这个View在16ms内更新完毕了,就不会卡顿,但是如果逻辑操作太多,16ms内没有更新完毕,剩下的操作就会丢到

liangtianmeng的专栏 975

Android SurfaceView总结及代码示例

#一.概述 SurfaceView与普通View不同,View树上的普通View共享一个Surface,而SurfaceView拥有单独的Surface。 而且普通View必须在UI线程中绘制,而SurfaceView可以在非UI线程中完成绘制工作,不占用UI主线程。 SurfaceView可以通过SurfaceHolder获取其Surface的尺寸和状态变化,并通过SurfaceHolder控制在Surface上的控制流程。 从Android 1.0...

u013914309的博客 1737

安卓SurfaceView截屏

关于安卓SurfaceView截屏 2015.12.9号是一个值得记得日子,开始拖着背包从学校出来,挤上火车,做着接近30小时的硬座,来到了美丽的成都,那时候赵雷的还没火,‘走到玉林路的尽头 坐在小酒馆的门口 ‘,多么诗情画意的生活啊。来不及享受这安逸之都的生活,便匆匆的开始实习生涯。 时至今日,也已经毕业大半年了,也从实习生正式成了职场人。身边大神很多,公司也是藏龙卧虎,也感觉应该养成

阿文的博客 1万+

Arcmap计算土方量教程

1. 创建现状TIN 结果数据: 2. 创建设计TIN 结果数据: 注意:现状TIN和设计TIN构建时候的坐标系不同,设置坐标系见最后的注意事项第1点,就是import(导入)那步骤,现状TIN构建时选择高程点数据或者等高线数据,设计TIN构建时候选择洱海面数据 3. TIN转栅格 改成你要存的数据库,注意中间不要有汉字 结果数据(设计TIN转栅格的同理) 4. 裁剪现状TIN转成的栅格 结果数据: 5. 计算土方量 结果数据: ...

欢迎关注,共同进步! 5014

Android的SurfaceView使用

Android的大多数控件都是继承自View的,因此在自定义控件时一般也是继承View类,但是对于高效的,游戏级别的绘图,或者是播放器等要求比较高的地方,普通的View类就 有点吃不开了,这个时候就要用到SurfaceView类。 因为比较高级,所以就该装B,单纯一个继承

lanpy88的专栏 2215

ZYNQ新手必看:5分钟搞定SD卡与QSPI Flash双启动模式配置(附常见问题排查)

本文为ZYNQ开发者提供了SD卡与QSPI Flash双启动模式的完整配置指南与深度排错方法。详细解析了从BootROM、FSBL到BOOT.bin的启动链条,并分步讲解了在Vivado/Vitis中的硬件配置、软件工程创建及BOOT.bin文件生成流程。针对SD卡格式化、文件放置以及QSPI Flash烧录中的常见陷阱(如版本差异、时钟配置)给出了具体解决方案和排查清单,帮助开发者快速实现可靠的产品启动与程序固化。

ll5678的博客 932

OpenBullet2 学习研究2-Conditions条件之KeyCheck的使用

上一节我们学习了如何安装Openbullet2以及如何新建一个配置,最后我们再配置里面新建一个Http的请求块,帮助我们发送了第一个请请求。这一节我们来学习check块。当我们发送请求以后,请求返回的内容是否是我们想要的,或者请求发送正确没有,这个我们怎么判断呢?这个时候就要用到check块了。

958

Android SurfaceView隐藏显示问题

近日在搞一个直播项目,用SurfaceView显示直播远端画面,但是有一个需求就是加一个按钮,可以显示隐藏SurfaceView,上代码 布局很简单,我通过直播SDK拿到surfaceview以后,直接 此时surfaceview显示到画面中了,那如何隐藏呢? 按照常理出牌肯定童鞋会说box.setVisibility(INVISIBLE)就行了,但是此时设置之后你会发现surfaceview...

qq_36356379的博客 1万+

WorkBench3.2 + VxWorks6.8安装教程

按照FTP连接主机和目标机,将整个VxWorks6.8的安装分为两个部分,一是在主机(win10系统,可以使用虚拟机或者实体机,推荐使用虚拟机)上安装workbench3.2,进行bootrom与VxWroks映像文件的生成,二是在虚拟机上安装VxWorks系统 19.10.10 首先很高兴文章能帮到大家,但由于本人已不做该方向良久,私信和评论的很多问题现在已经无法解答,如果大家有什么问题欢迎...

Alive的博客 3万+

android安卓SurfaceView与view的区别是什么?

原贴: link 原贴: link surfaceView和View最本质的区别在于: surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面。那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中

ruiruiddd的博客 1636

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 241

FFmpeg入门详解之110:RTSP协议讲解

TCP/IP 协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。正在上传…重新上传取消RTSP是基于文本的协议,采用ISO10646字符集,使用UTF-8编码方案。行以CRLF中断(\r\n:10,13:0x0A,0x0D),包括消息类型、消息头、消息体和消息长。

福优学苑@音视频+流媒体 2529

android surfaceview bitmap,Android使用SurfaceView绘制静态图像

使用 SurfaceView 绘图需要为 SurfaceView 对象添加 SurfaceHoloder.Callback 接口,并在该接口的 surfaceCreated() 方法中通过 lockCanvas() 方法获取 Canvas 对象,以此保证当获取 Canvas 时,SurfaceView 对象可用。当绘图工作完成后,通过 SurfaceHoloder.unlockCanvas-And...

weixin_30382087的博客 1668

偏最小二乘回归分析原理详解和案例分析实例

偏最小二乘回归分析原理详解背景偏最小二乘回归分析 Partial least squares regression analysis基本思想建模步骤步骤一:分别提取两变量组的第一对成分,并使之相关性达最大步骤二:建立 y1,⋯ ,yp\boldsymbol{y}_{1}, \cdots, \boldsymbol{y}_{p}y1​,⋯,yp​ 对 u1\boldsymbol{u}_{1}u1​ 的回归及 x1,⋯ ,xm\boldsymbol{x}_{1}, \cdots, \boldsymbol{x}_{

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 9977

Android SurfaceView 的使用

SurfaceView 的作用: SurfaceView 适用被动更新,如频繁的刷新,在子线程刷新不会阻塞主线程,适用于界面频繁更新 (View适用主动更新) SurfaceView可以控制刷新频率。 SurfaceView底层利用双缓存机制,绘图时不会出现闪烁问题。 SurfaceView 的使用方法: 一般都是view继承SurfaceView,实现SurfaceHolder.Callback接口 会自动生成3个方法如下 @Override public void surfaceC

小牧在一直在学习,在前进的道路上大家一起学习,进步。 4975

华为OD机试真题 新系统2026-04-15 C++ 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 210

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android SurfaceView类的使用

Android提供了View进行绘图处理,View可以满足大部分绘图需求,但在某些时候,却也有心有余而力不足的地方,View是通过刷新来绘制视图,Android系统通过发出VSYNC信号来进行屏幕的重绘,刷新时间间隔为16ms。但是如果在16ms内完成所需执行的操作用户不会感觉到卡顿,而如果执行的操作逻辑太多,特别是频繁的刷新界面,就会不断的阻塞主线程,导致画面卡顿。  Android提供了Su

WannerWang的博客 1031

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

安卓(Android)surfaceview无法使用gesturedetector的解决办法

因为课程项目里用到了surfaceview并且需要在上面响应安卓的手势

Craigm的专栏 1726

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android开发——SurfaceView使用总结

0. 前言在Android开发中,如果需要在主线程之外的线程绘制界面、View需要频繁刷新或刷新时数据流较大时,就要考虑使用SurfaceView了。因为SurfaceView可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。1. SurfaceView和View的区别(1)View主要用于主动刷新的情况下,而SurfaceView多用于频繁地被动刷新。(2)View是在主...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 5730

Android开发简单使用surfaceview

在安卓开发中自定义View是比较普遍使用的,而且对于希望从事安卓开发的程序员来说,自定义View也应该是最安卓开发部分最难的,可能一个程序猿在两年内都在跟学习自定义view打交道。好了,废话不多说,我们来简单的使用一下surfaceview,这里要说明的是surfaceview是运行在子线程的,一般在游戏中使用较多。请看下面的代码: package com.example.surface; i

oDaBenNiu的博客 860
上一篇: Android中AIDL使用例子
下一篇: Activity的启动模式与flag详解
chenxiaoning87
博客等级 码龄17年 15粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值