关于SurfaceView
使用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相关推荐
- Android SurfaceView 黑背景的处理方法
SurfaceView 绘制的时候出现黑背景的如下 或者如下 处理方法就是添加 //画布透明处理this.setZOrderOnTop(true);this.mSurfaceHolder.setFor ...
- 利用SurfaceView显示正弦曲线,仿造示波器
众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡 ...
- Android UI SurfaceView的使用-绘制组合图型,并使其移动
绘制容器类: //图形绘制容器 public class Contanier {private List<Contanier> list;private float x=0,y=0;pub ...
- 【Android游戏开发之七】(游戏开发中需要的样式)再次剖析游戏开发中对SurfaceView中添加组件方案!...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/308.html ...
- SurfaceView 间取得焦点
在SurfaceView中我们的onKeyDown虽然重写了view的函数, 但一定需要我们在初始化的时候去声明焦点 //添加这个来取得按健事件 this.setFocusable(true); th ...
- 注释参数opengl的surfaceview使用findViewById返回null问题解决
在写这篇文章之前,xxx已经写过了几篇关于改注释参数主题的文章,想要了解的朋友可以去翻一下之前的文章 尼玛,搞了一年多引擎,苦逼的我又开始研究起android开发来了 手里有个需求须要应用Opengl ...
- Android之SurfaceView(二)
接下来讲讲使用surfView来实现动画.surfView具体的用法说明已在上一篇中讲了,这里就不仔细将了来直接看代码. 1.首先创建一个Contanier容器,用来添加各种画板代码如下: </ ...
- Android之SurfaceView(一)
首先我们先来看下官方API对SurfaceView的介绍 SurfaceView的API介绍 Provides a dedicated drawing surface embedded inside ...
- SurfaceView的一个小应用:开发示波器
SurfaceView与普通View还有一个重要区别:View的绘图必须在UI线程中进行,但SurfaceView不存在这个问题,因为它是由SurfaceHolder来完成的.所以对于View组件,如 ...
- Android实时取景:用SurfaceView实现
对于基于摄像头的Android应用,实时取景是一个基本前提,通过前置或后置摄像头持续获取捕获到的内容,可以进一步做处理(人脸检测.美颜.滤镜等). 所谓实时取景,简单说就是调用android的摄像头, ...
最新文章
- 部署可扩展的目标检测管道:推理过程(下)
- P3项目全球模板狗血设置之二 --- 移动类型523收货不能自动创建批次号
- java redis mq_redis之mq实现发布订阅模式
- \00在python中
- UI层调用WCF服务实例(源码)
- java 内部类 菜鸟编程,java中的匿名内部类
- js中遇到的一个错误Uncaught SyntaxError: missing )after argument list
- mysql嵌套select_mysql中如何嵌套使用insert和select
- Variant类型转换成CString代码
- Idea导出可运行Jar包
- Cordova系列(一)
- vos3000_v7.x版本的快速安装方法
- 77GHz毫米波雷达快速chirp信号技术(三):测角原理
- “7天”连锁酒店郑南雁
- Python 辛普森积分法 simps计算sin(x)的值(完美实现)
- 基于java SpingBoot框架的企业办公管理系统
- vue+element 实现时间选择器切换周月选择
- SRA数据下载(通过EBI-ENA数据库,使用ASpera)
- 基于EasyNVR摄像机流媒体服务器实现RTSP或Onvif监控摄像头Web无插件化直播监控
- 如何基于MFC制作简易绘图软件