SurfaceView 是在子线程中更新画面的组件, View是 在 UI 的主线程中更新画面, 适合于做动画.
使用SurfaceView 通常要实现 SurfaceHolder.Callback接口,SurfaceView 类的生命周期有3个回调函数,分别为:
public abstract  void surfaceCreated(SurfaceHolder holder) 在SurfaceView 创建时调用
public abstract  void surfaceChanged(SurfaceHolder  holder,  int  format,  int width,  int height) 在SurfaceView 改变时调用
public  abstract  void surfaceDestroyed(SurfaceHolder  holder)在SurfaceView 销毁前调用

此外, 还有一个重要方法:
protected void  onDraw(Canvas c)  用来绘制SurfaceView 画面, 每一次SurfaceView  中画面改变都是调用此方法.
通常实现动画效果原理是:
新建一个线程类,每隔一段时间调用SurfaceView 的onDraw(), 在onDraw() 方法中的画面也有一个线程类在时刻改变,这样后一个线程类实现了onDraw() 画面中显示内容的变化, 前一个线程类 时刻刷新画面,这样就形成了动画.
具体代码请参见 SufaceView_3_7 工程, 讲解一下两个线程类

public class OnDrawThread extends Thread {
MySurfaceView msv; // 得到MySurfaceView的引用
SurfaceHolder sh; // SurfaceHolder引用
public OnDrawThread(MySurfaceView msv) {super();this.msv = msv; // 构造方法中,将msv引用指向调用了该类的MySurfaceView的对象sh = msv.getHolder();
}
@Override
public void run() {super.run();Canvas canvas = null; while (true) {   // 这个循环用于时刻刷新界面try {canvas = sh.lockCanvas(null); // 将canvas的引用指向surfaceView的canvas的对象synchronized (this.sh) { // 绘制过程,可能带来同步方面的问题,加锁if (canvas != null) {msv.onDraw(canvas);    // 这里调用onDraw(),时刻刷新画面}}} finally {try {if (sh != null) {sh.unlockCanvasAndPost(canvas); // 绘制完后解锁}} catch (Exception e) {e.printStackTrace();}}
try {Thread.sleep(Constant.ONDRAWSPEED); // 休息1秒钟} catch (Exception e) {e.printStackTrace();}}
}
}
----------------------------------
//该类是控制duke图片运动的类
public class PicRunThread extends Thread{
MySurfaceView msv;         //MySurfaceView的引用
private float picX=0;   //图片x坐标
private float picY=Constant.SCREENHEIGHT-Constant.PICHEIGHT;   //图片y坐标
boolean yRunFlag=false;  //y方向上的运动标记,false时y=y+speed,true时y=y-speed
int picAlphaNum=0;     //图片变暗效果中画笔的alpha值
public PicRunThread(MySurfaceView msv) {super();this.msv = msv;   //将该线程类的引用指向调用其的MySurfaceView的对象
}@Override
public void run() {super.run();while(true){             //这个循环用于显示内容变化,实现重复显示,  如果没有则画面只显示一遍//控制duke图片的运动while(this.picX<Constant.SCREENWIDTH){   //当图片的左边完全超过屏幕的右边时,循环结束msv.setPicX(picX);msv.setPicY(picY);picX=picX+Constant.PICXSPEED;if(yRunFlag){//应该向上运动,自减picY=picY-Constant.PICYSPEED;}else{//应该向下运动,自加picY=picY+Constant.PICYSPEED;}if(picY<=0){         //到达屏幕上沿yRunFlag=false;}else if(picY>Constant.SCREENHEIGHT-Constant.PICHEIGHT){  //到达屏幕下沿
yRunFlag=true;}try{Thread.sleep(Constant.PICRUNSPEED);}catch(Exception e){e.printStackTrace();}}//图片变暗效果演示msv.picAlphaFlag=true;       //开启图片变暗效果for(picAlphaNum=100;picAlphaNum<=200;picAlphaNum++){if(picAlphaNum==200){msv.picAlphaFlag=false;     //当图片变暗效果结束,标记重置picX=0;   //图片x坐标picY=Constant.SCREENHEIGHT-Constant.PICHEIGHT;   //图片y坐标System.out.println(msv.picAlphaFlag+"picX:"+picX+"picY:"+picY);}msv.setPicAlphaNum(picAlphaNum);try{Thread.sleep(Constant.PICALPHASPEED);}catch(Exception e){e.printStackTrace();}}}
}
}

效果图示意如下:

关于SurfaceView相关推荐

  1. Android SurfaceView 黑背景的处理方法

    SurfaceView 绘制的时候出现黑背景的如下 或者如下 处理方法就是添加 //画布透明处理this.setZOrderOnTop(true);this.mSurfaceHolder.setFor ...

  2. 利用SurfaceView显示正弦曲线,仿造示波器

    众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡 ...

  3. Android UI SurfaceView的使用-绘制组合图型,并使其移动

    绘制容器类: //图形绘制容器 public class Contanier {private List<Contanier> list;private float x=0,y=0;pub ...

  4. 【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/308.html   ...

  5. SurfaceView 间取得焦点

    在SurfaceView中我们的onKeyDown虽然重写了view的函数, 但一定需要我们在初始化的时候去声明焦点 //添加这个来取得按健事件 this.setFocusable(true); th ...

  6. 注释参数opengl的surfaceview使用findViewById返回null问题解决

    在写这篇文章之前,xxx已经写过了几篇关于改注释参数主题的文章,想要了解的朋友可以去翻一下之前的文章 尼玛,搞了一年多引擎,苦逼的我又开始研究起android开发来了 手里有个需求须要应用Opengl ...

  7. Android之SurfaceView(二)

    接下来讲讲使用surfView来实现动画.surfView具体的用法说明已在上一篇中讲了,这里就不仔细将了来直接看代码. 1.首先创建一个Contanier容器,用来添加各种画板代码如下: </ ...

  8. Android之SurfaceView(一)

    首先我们先来看下官方API对SurfaceView的介绍 SurfaceView的API介绍 Provides a dedicated drawing surface embedded inside ...

  9. SurfaceView的一个小应用:开发示波器

    SurfaceView与普通View还有一个重要区别:View的绘图必须在UI线程中进行,但SurfaceView不存在这个问题,因为它是由SurfaceHolder来完成的.所以对于View组件,如 ...

  10. Android实时取景:用SurfaceView实现

    对于基于摄像头的Android应用,实时取景是一个基本前提,通过前置或后置摄像头持续获取捕获到的内容,可以进一步做处理(人脸检测.美颜.滤镜等). 所谓实时取景,简单说就是调用android的摄像头, ...

最新文章

  1. 部署可扩展的目标检测管道:推理过程(下)
  2. P3项目全球模板狗血设置之二 --- 移动类型523收货不能自动创建批次号
  3. java redis mq_redis之mq实现发布订阅模式
  4. \00在python中
  5. UI层调用WCF服务实例(源码)
  6. java 内部类 菜鸟编程,java中的匿名内部类
  7. js中遇到的一个错误Uncaught SyntaxError: missing )after argument list
  8. mysql嵌套select_mysql中如何嵌套使用insert和select
  9. Variant类型转换成CString代码
  10. Idea导出可运行Jar包
  11. Cordova系列(一)
  12. vos3000_v7.x版本的快速安装方法
  13. 77GHz毫米波雷达快速chirp信号技术(三):测角原理
  14. “7天”连锁酒店郑南雁
  15. Python 辛普森积分法 simps计算sin(x)的值(完美实现)
  16. 基于java SpingBoot框架的企业办公管理系统
  17. vue+element 实现时间选择器切换周月选择
  18. SRA数据下载(通过EBI-ENA数据库,使用ASpera)
  19. 基于EasyNVR摄像机流媒体服务器实现RTSP或Onvif监控摄像头Web无插件化直播监控
  20. 如何基于MFC制作简易绘图软件

热门文章

  1. Java中多线程、多线程的实现方式、同步代码块的方式
  2. 统计手机号耗费的总上行流量、下行流量、总流量(序列化)
  3. 毕业论文的研究背景怎么写?
  4. 五彩斑斓的 Black —— Python代码格式化工具
  5. ArcGIS之克里金插值教学
  6. Python selenium —— 将你的自动化脚本打包成一个exe
  7. android的json数据解析,Android数据解析-JSON解析
  8. AC多模匹配+完整实现源码
  9. linux性能分析工具总结(初级工具篇)
  10. 西数硬盘砍头流程说明