Android之SurfaceView学习一
时间:2022-04-27
本文章向大家介绍Android之SurfaceView学习一,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实例代码:
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* surfaceview的实例,用来处理贴图问题
*/
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(); // 获得SurfaceHodler对象
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;
}
}
public class MyThread extends Thread {
public boolean isRun;
private SurfaceHolder holder;
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();
c.save(); // 保存当前绘图环境
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("This is the " + (count++) + " seconds",
100, 310, p);
c.restore(); // 恢复先前绘图环境
Thread.sleep(1000); // sleep 1 second
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(c!= null){
holder.unlockCanvasAndPost(c); // 结束锁定画布,并提交改变
}
}
}
}
}
}
上面的代码从整体的使用方面给出了实例,接下来进行逐步分解。
1. 首先是声明一个继承SurfaceView并且实现SurfaceHolder.CallBack的子类
class MyView extends SurfaceView implements SurfaceHolder.Callback {
@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
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
2. 在子类中获得一个用于控制suerfce对象的surfaceHolder对象
holder = SurfaceView.getHodler();
holder.addCallback()
3. 在surfaceCreated方法中调用处理绘图线程,并将holder对象传递给绘图线程
4. 绘图线程中处理步骤:
//首先获得canvas对象
Canvas c = holder.lockCanvas();
c.store();
...
...
//解锁并提交改变
c.restore();
holder.unlockCanvasAndPost(c);
- 【源码分享】机器学习之Python支持向量机
- [接口测试 - 基础篇] 08 封装个基本的excel解析类
- 关关的刷题日记10——Leetcode 1. Two Sum 方法1
- BZOJ 2463: [中山市选2009]谁能赢呢?(新生必做的水题)
- 10个Python面试常问的问题
- 关关的刷题日记11——Leetcode 1. Two Sum 方法2、3
- 计蒜客:百度的科学计算器(简单)【python神解】
- 关关的刷题日记12——Leetcode 189. Rotate Array 方法1、2、3
- 关关的刷题日记13——Leetcode 414. Third Maximum Number
- 关关的刷题日记14——Leetcode 167. Two Sum II - Input array is sorted
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
- 【专知-关关的刷题日记15】Leetcode 27. Remove Element 方法1、2、3
- [接口测试 - 基础篇] 07 来来来,一起读写excel玩玩之一
- 时间序列分析算法【R详解】
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android实现单页面浮层可拖动view的一种方法
- 排查 Node.js 服务内存泄漏,没想到竟是它?
- Android判断网络状态的代码
- Android开发实现布局中为控件添加选择器的方法
- Android控制文本输入框最多输入10个字符长度
- Elasticsearch 内部数据结构深度解读
- 关于 Elasticsearch 段合并,这一篇说透了!
- 解了这十道C语言题,你敢说你精通C语言?
- 微服务中使用Maven BOM来管理你的服务版本
- 设计模式之代理模式(文末赠书)
- 使用Spring IoC容器:选BeanFactory还是ApplicationContext?
- Stream使用这么久,它是如何提高遍历集合效率?
- FastDFS 分布式文件系统入门
- 「翻译」 如何Bypass rbash
- 代码审计-.NET下的序列化与反序列化(BinaryFormatter)