Android -- SurfaceView绘制
SurfaceView
SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作。
- 步骤
1.用SurfaceView进行绘制,首先要创建一个类,继承 SurfaceView,同时这个类应该实现SurfaceHolder.Callback接口。
这个接口中的三个回调函数(surfaceChanged(SurfaceHolder holder, int format, int width, int height),surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder))分别对应Surface何时更改、创建和销毁。
2.对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用 getHolder()来获得SurfaceHolder对象,然后用addCallback()加上回调接口(因为你的类实现了相应的接口,所以此处传入this即可)。
3.在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。
4.绘制:在线程类的run()方法中进行绘制操作,通过lockCanvas()方法获得Canvas对象,然后就可以用这个对象进行绘制,绘制完成后调用unlockCanvasAndPost(),传入Canvas对象,这时Surface将会按Canvas进行绘制。
注意:每次利用SurfaceHolder获得画布时,前一次的内容将会保留。
Code
public class MySurfaceView extends SurfaceView implements
SurfaceHolder.Callback
{ private DrawThread mThread = null; public MySurfaceView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
init();
} public MySurfaceView(Context context, AttributeSet attrs)
{
super(context, attrs);
init();
} public MySurfaceView(Context context)
{
super(context);
init();
} private void init()
{
Log.d(AppConstants.LOG_TAG, "init"); SurfaceHolder holder = getHolder();
holder.addCallback(this); mThread = new DrawThread(holder); } @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
Log.d(AppConstants.LOG_TAG, "onSizeChanged");
super.onSizeChanged(w, h, oldw, oldh); } @Override
public void surfaceCreated(SurfaceHolder holder)
{
Log.d(AppConstants.LOG_TAG, "surfaceCreated");
mThread.setRun(true);
mThread.start(); } @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
Log.d(AppConstants.LOG_TAG, "surfaceChanged");
} @Override
public void surfaceDestroyed(SurfaceHolder holder)
{
Log.d(AppConstants.LOG_TAG, "surfaceDestroyed");
mThread.setRun(false); } /**
* 绘制线程类
*
*/
public class DrawThread extends Thread
{
private SurfaceHolder mHolder = null;
private boolean isRun = false; public DrawThread(SurfaceHolder holder)
{
Log.d(AppConstants.LOG_TAG, "DrawThread Constructor");
mHolder = holder; } public void setRun(boolean isRun)
{
Log.d(AppConstants.LOG_TAG, "DrawThread setRun: " + isRun);
this.isRun = isRun;
} @Override
public void run()
{
Log.d(AppConstants.LOG_TAG, "DrawThread run");
int count = 0; while (isRun)
{
Canvas canvas = null;
synchronized (mHolder)
{
try
{
Log.d(AppConstants.LOG_TAG, "Drawing-------------");
canvas = mHolder.lockCanvas();
canvas.drawColor(Color.WHITE);
Paint p = new Paint();
p.setColor(Color.BLACK); Rect r = new Rect(100, 50, 300, 250);
canvas.drawRect(r, p);
canvas.drawText("这是第" + (count++) + "秒", 100, 310, p); Thread.sleep(1000);// 睡眠时间为1秒 }
catch (Exception e)
{
Log.d(AppConstants.LOG_TAG, "throw Exception in run");
e.printStackTrace(); }
finally
{
if (null != canvas)
{
mHolder.unlockCanvasAndPost(canvas);
}
} } }
} } }
我是天王盖地虎的分割线
参考:http://www.cnblogs.com/mengdd/archive/2013/04/09/3009897.html
Android -- SurfaceView绘制的更多相关文章
- android SurfaceView绘制实现原理解析
在Android系统中,有一种特殊的视图,称为SurfaceView,它拥有独立的绘图表面,即它不与其宿主窗口共享同一个绘图表面.由于拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独 ...
- android SurfaceView绘制 重新学习--基础绘制
自从大二写了个android游戏去参加比赛,之后就一直写应用,一直没用过SurfaceView了,现在进入了游戏公司,准备从基础开始重新快速的学一下这个,然后再去研究openGL和游戏引擎. 直接上代 ...
- android SurfaceView绘制 重新学习--控制动画移动
直接上demo,图是自己切的,将就用吧.点击左右两边分别向左右移动. public class MySurfaceView extends SurfaceView implements Callbac ...
- android SurfaceView绘制 重新学习--切图clipRect详解
解释都在代码注释中: public class SampleView extends View { private Paint mPaint; private Path mPath; public S ...
- Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法
http://www.cnblogs.com/SkyD/archive/2010/11/08/1871423.html Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法 Surfa ...
- Android SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
- Android SurfaceView实战 带你玩转flabby bird (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42965779 ,本文出自:[张鸿洋的博客] 1.概述 哈,记得以前写过Andro ...
- Android SurfaceView内容获取
Android SurfaceView内容获取 这几天在做一个Android的小项目,项目中需要使用到SurfaceView来显示相机捕获的内容,同时还有一个SurfaceView用于绘制一些辅助线, ...
- 简单研究Android View绘制三 布局过程
2015-07-28 17:29:19 这一篇主要看看布局过程 一.布局过程肯定要不可避免的涉及到layout()和onLayout()方法,这两个方法都是定义在View.java中,源码如下: /* ...
随机推荐
- c#多线程实现函数同步运行
我们假设有方法run1()和run2(),耗时都比较大,实现他们同步运行将大大提高程序的效率,在这里考虑使用多线程的方法. 首先添加引用,定义bool型i,j为false. using System. ...
- vue开发关于微信授权登录以及路由mode模式(Hash|History)和手机平台(andriod|IOS)不得不说的故事
引用链接: https://segmentfault.com/a/1190000010753247?utm_source=tuicool&utm_medium=referral
- 转:Exploiting Windows 10 in a Local Network with WPAD/PAC and JScript
转:https://googleprojectzero.blogspot.com/2017/12/apacolypse-now-exploiting-windows-10-in_18.html aPA ...
- powershell 性能测试小脚本
powershell 性能测试: 转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 1. 将待测试的脚本封装在代码块中 2. 使用 Get-Ch ...
- ZOJ 3613 Wormhole Transport
斯坦纳树,$dp$. 先求出每个状态下连通的最小花费,因为可以是森林,所以$dp$一下. #include<bits/stdc++.h> using namespace std; int ...
- Python 函数系列 - Str对path的处理
由此可见,“\”是转义字符,它能够将第2个“\”从转义字符转回普通字符,从而“\n”就不再起到换行符的作用. 这样操作虽然简单,但是遇到下方这个路径,看起来就会有些麻烦! path = 'D:\new ...
- Java Web开发——HTML CSS JavaScript 杂记
HTML是一种在互联网上常见的网页制作标注性语言,并不能算作一种程序设计语言.因为它相对程序设计语言来说缺少了其应所有的特征.对于网站设计人员来说,只使用HTML是不够的,需要在页面中引入CSS样式. ...
- JSTL-3
.循环标签:forEach标签, forTokens标签 <c:forEach>:标签:该标签根据循环条件遍历集合(Collection)中的元素 <c:forEach [var=& ...
- functools.wraps 带参数的装饰器 多个装饰器装饰同一个函数
装饰器开发原则 : 开放封闭原则装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质 : 闭包函数 def wrapper(func): def inner(*args, ...
- 【BZOJ 3307】 3307: 雨天的尾巴 (线段树+树链剖分)
3307: 雨天的尾巴 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 458 Solved: 210 Description N个点,形成一个树状结 ...