Android 开发 SurfaceView 总结
Android中一种常见的自定义画UI接口类:SurfaceView.可以在异步线程中,完成相关数据更新。
首先介绍几个基本的定义,在其他知识中也会设计如下名词:
1.Paint
画笔,所有的图像、图形都是由画笔完成的。
定义非常简单:
Paint paint = new Paint();
paint.setColor(Color.Black);//设置画笔的颜色
2.Canvas
画布,图像和图形都是通过Paint画在画布上面。画布对象通常是通过SurfaceHolder.lockCanvax()获得。
Canvas canvas = holder.lockCanvas();
canvas.drawRect(0,0,widht,height,paint);//画矩形
3.Surface
在应用的时候,没有使用到具体的实现类和抽象类。
API里面的描述是:Surface是原始图像缓存区的一个句柄(原始图像缓存区是有屏幕图像合成器管理的)。因此,可以知道Canvas所需要展示的数据,会被加载到Surface中,然后显示在屏幕上的。
4.SurfaceView
一个屏幕显示的View,控制Surface的显示大小,位置等。说白了就类似TextView一样。
需要子类实现具体的制订化功能,继承SurfaceView的同时,还需要实现SurfaceHolder.Callback接口(后面有讲解)。
5.SurfaceHolder
怎么能说清楚呢,SurfaceHolder是Surface的控制器,提供几个方法:
addCallback(SurfaceHolder.Callback callback); //添加SurfaceHolder.Callback的监听实现
lockCanvas();
lockCanvas(Rect dirty);
unlockCanvas(Canvas canvas);
6.SurfaceHolder.Callback
是一个接口,实现类可以监听SurfaceView的状态变化。接口方法如下:
surfaceCreated();
surfaceChanged();
surfaceDestory();
具体使用Demo,完成的功能就是将一张图片,上下不停的滑动:
1、RBSurfaceView 是Surface的实现类。
public class RBSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private Paint paint;
private WindowManager windowManager;
private Context context;
private float screenWidth,screenHeight;
private float bitmapX,bitmapY;
private int alphaNum;
private boolean alphaFlag ;
private OnRunThread onRunThread;
private OnDrawThread onDrawThread;
@SuppressWarnings("deprecation")
public RBSurfaceView(Context context) {
super(context);
// TODO Auto-generated constructor stub
this.context = context;
getHolder().addCallback(this);
windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
screenWidth = (float) windowManager.getDefaultDisplay().getWidth();
screenHeight =(float) windowManager.getDefaultDisplay().getHeight();
paint = new Paint();
onRunThread = new OnRunThread(this);
onDrawThread = new OnDrawThread(this);
onRunThread.start();
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
paint.setColor(Color.WHITE);
canvas.drawRect(0, 0, screenWidth, screenHeight, paint);
Bitmap bitmapA = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
canvas.drawBitmap(bitmapA, bitmapX, bitmapY, paint);
if (alphaFlag) {
Bitmap bitmapB = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_gcoding);
paint.setAlpha(alphaNum);
canvas.drawBitmap(bitmapB, 0, 0, paint);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
onDrawThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
public float getBitmapX() {
return bitmapX;
}
public void setBitmapX(float bitmapX) {
this.bitmapX = bitmapX;
}
public float getBitmapY() {
return bitmapY;
}
public void setBitmapY(float bitmapY) {
this.bitmapY = bitmapY;
}
public int getAlphaNum() {
return alphaNum;
}
public void setAlphaNum(int alphaNum) {
this.alphaNum = alphaNum;
}
public float getScreenWidth() {
return screenWidth;
}
public void setScreenWidth(float screenWidth) {
this.screenWidth = screenWidth;
}
public float getScreenHeight() {
return screenHeight;
}
public void setScreenHeight(float screenHeight) {
this.screenHeight = screenHeight;
}
public boolean isAlphaFlag() {
return alphaFlag;
}
public void setAlphaFlag(boolean alphaFlag) {
this.alphaFlag = alphaFlag;
}
}
2、OnDrawThread 是不停的让RBSurfaceView的onDraw方法画图片
public class OnDrawThread extends Thread{
private RBSurfaceView surfaceView;
private SurfaceHolder holder;
public OnDrawThread(RBSurfaceView surfaceView){
super();
this.surfaceView = surfaceView;
holder = surfaceView.getHolder();
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Canvas canvas = null;
while (true) {
canvas = holder.lockCanvas(null);
synchronized (surfaceView) {
if (canvas != null) {
surfaceView.onDraw(canvas);
}
}
holder.unlockCanvasAndPost(canvas);
try {
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
3、OnRunThread 主要负责不停的变化图片的坐标,然后设置给RBSurfaceView。
public class OnRunThread extends Thread{
private RBSurfaceView surfaceView;
private SurfaceHolder holder;
public OnRunThread(RBSurfaceView surfaceView){
super();
this.surfaceView = surfaceView;
holder = surfaceView.getHolder();
bitmapX = 0;
bitmapY = 0;
}
boolean runFlag;
int alphaNum;
float bitmapX;
float bitmapY;
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while (true) {
while (bitmapX < surfaceView.getScreenWidth()) {
surfaceView.setBitmapX(bitmapX);
surfaceView.setBitmapY(bitmapY);
if (runFlag) {
bitmapY = bitmapY - 20;
}else {
bitmapY = bitmapY + 20;
}
if (bitmapY <=0) {
runFlag = false;
}else if (bitmapY >= surfaceView.getScreenHeight()+60) {
runFlag = true;
}
try {
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
surfaceView.setAlphaFlag(true);
for (alphaNum = 0; alphaNum <= 255; alphaNum++) {
if (alphaNum == 255) {
surfaceView.setAlphaFlag(false);
bitmapX = 0;
bitmapY = surfaceView.getScreenHeight() +60;
}
surfaceView.setAlphaNum(alphaNum);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Android 开发 SurfaceView 总结的更多相关文章
- Android开发学习清单
目录: 第1章 Android应用与开发环境1.1 Android的发展和历史1.1.1 Android的发展和简介1.1.2 Android平台架构及特性1.2 搭建Android开发环境1.2.1 ...
- Android使用SurfaceView实现墨迹天气的风车效果
SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...
- Android开发中的问题及相应解决(持续更新)
最近博客写的少了,以后还得经常更新才行. ------------------------------------------------------------ 1.特定业务需求下try cath ...
- Android之SurfaceView学习(一)
对应的中文翻译SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface.你可以控制这个Surface的格式和尺寸.Surfaceview控制这个Surface ...
- 【随笔】android开发的学习路线
第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正则表达式. 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化 ...
- Android开发中,那些让您觉得相见恨晚的方法、类或接口
Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...
- Android开发面试经——4.常见Android进阶笔试题(更新中...)
Android开发(29) 版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...
- [转]【eoeAndroid索引】史上最牛最全android开发知识汇总
一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...
- android开发的学习路线(转)
第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正则表达式. 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化 ...
随机推荐
- 吴裕雄--天生自然HADOOP操作实验学习笔记:hdfs分布式文件系统安装
实验目的 复习安装jdk 学习免密码登录 掌握安装配置hdfs集群的方法 掌握hdfs集群的简单使用和检查其工作状态 实验原理 1.hdfs是什么 hadoop安装的第一部分是安装hdfs,hdfs是 ...
- 如何开发自己的第一个 Serverless Component
前言 上一篇 基于 Serverless Component 的全栈解决方案 介绍 Serverless Component 是什么和如何使用 Serverless Component 开发一个全栈应 ...
- TChart-数据编辑(TChartListBox,TeeCommander)
先上图 功能代码: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contr ...
- Easyui-Treegrid使用注意事项-sunziren
版权声明:本文为sunziren原创文章,博客园首发,转载务必注明出处以及作者名称. 最近,工作中有一个网页需要用到前端框架easyui的treegrid组件,因此我对这个treegird研究了一段时 ...
- linux安装docker和docker compose
运行 sudo -s 切换到root用户. 1.卸载旧版本Docker(如果系统之前没安装过Docker,可以跳过): yum remove docker \ docker-client \ dock ...
- gulp常用插件之gulp-rev-collector使用
更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-rev-collector这是一款根据gulp-rev生成的manifest.json文件中的映射, 去替换文件名称, 也可以替换路径. ...
- IO流学习之File类
File类 Java文件类以抽象的方式代表文件名和目录路径名.该类主要用于文件和目录的创建.文件的查找和文件的删除等. File对象代表磁盘中实际存在的文件和目录.就是把文件和目录转换成对象,读取到内 ...
- CF566C Logistical Questions(10-1)
题意 \(n\)个点的树,有点权,有边权,\(f(x)=\sum\limits_{i=1}^n w_idis(i,x)^{1.5}\),求最小的\(f(x)\)的\(x\) 单独考虑一条链,顺序编号, ...
- SYZOJP186 你猜猜是不是DP 二分+hash解法
SYZOJP186 你猜猜是不是DP题解 题目传送门 现在给两个仅包含小写字母的字符串a,b ,求a 与b的最长公共连续子串的长度. 对于20%的数据,a,b长度 ∈ [1, 200] 对于50%的数 ...
- webpack, autoprefixer
可以通过postcss-loader 添加 const autoprefixer = require('autoprefixer'); ... { loader: 'postcss-loader', ...