Android 利用SurfaceView进行图形绘制
SurfaceView使用介绍
SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作。
要使用SurfaceView进行绘制,步骤如下:
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获得画布时,前一次的内容将会保留。
代码示例

package com.example.hellosurfaceview; import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView; 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);
}
} } }
} } }

参考资料
官方文档:
API Guides:Canvas and Drawables
http://developer.android.com/guide/topics/graphics/2d-graphics.html
SurfaceView:
http://developer.android.com/reference/android/view/SurfaceView.html
SurfaceHolder:
http://developer.android.com/reference/android/view/SurfaceHolder.html
博客:
Android之SurfaceView学习(一):
http://www.cnblogs.com/xuling/archive/2011/06/06/android.html
剖析 SurfaceView:
Android 利用SurfaceView进行图形绘制的更多相关文章
- Android: 利用SurfaceView绘制股票滑动直线解决延迟问题
1.背景介绍 最近项目要绘制股票走势图,并绘制能够跟随手指滑动的指示线(Indicator)来精确查看股票价格和日期.如下图所示: 上图中的那条白色直线就是股票的指示线,用来跟随手指精确确定股票的时间 ...
- Android UI SurfaceView的使用-绘制组合图型,并使其移动
绘制容器类: //图形绘制容器 public class Contanier { private List<Contanier> list; private float x=0,y=0; ...
- Android UI SurfaceView的使用-绘制单个图型或多个图形
新建MyView类继承自SurfaceView: public class MyView extends SurfaceView implements SurfaceHolder.Callback { ...
- Android自定义控件之基本图形绘制
入门示例代码 在Android中Paint类就是画笔,Canvas 就是画布 对于画笔的大小,粗细,颜色,透明度都在paint类中设置,对于画出的成品,比如圆,方形,等在canvas类中的函数生成 入 ...
- Android利用canvas画各种图形
Android利用canvas画各种图形(点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形) 本文链接:https://blog.csdn.net/rhljiayou/article/det ...
- Android 利用属ObjectAnimator,AnimatorSet性动画绘制一个弹球,加速下落,到底部时挤压,然后减速上弹
属性动画主要的几个类介绍: 1.ValueAnimator:这个类提供了一个简单的计时引擎运行动画动画计算值和设置目标对象.注意:使用该类时一般都是用:ObjectAnimator,而基于Object ...
- Android 4.0的图形硬件加速及绘制技巧
转:http://zuiniuwang.blog.51cto.com/3709988/721798 从Android 3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速.使用GP ...
- Android OpenGL ES 开发:绘制图形
OpenGL 绘制图形步骤 上一篇介绍了 OpenGL 的相关概念,今天来实际操作,使用 OpenGL 绘制出图形,对其过程有一个初步的了解. OpenGL 绘制图形主要概括成以下几个步骤: 创建程序 ...
- 图形绘制 Canvas Paint Path 详解
图形绘制简介 Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.大部分2D使用的api都在android.grap ...
随机推荐
- 【翻译】How To Tango With Django 1.5.4 第三章
django基础 3.1测试你的配置 测试你的python版本和你的django版本是否兼容 3.2新建django工程 在dos里面进到你事先新建的code文件夹,然后在执行下列命令新建工程 c:\ ...
- Sublime Text3 常用快捷键
1. 更改变量名的几种方法 a.选中变量,ctrl+d 一个个选择 b.选中变量,alt+F3 2.查找打开过的文件:Ctrl+P,然后输入最近的文件名就可以即时预览到文件内容. 3.ctrl+r ...
- App 打包并跳过 AppStore 的发布下载
一.App 打包 (编译 -> 链接 -> 打包) 1) 下载发布版的证书并安装. 2)Target -> Build Setting,改为发布版本的 profile 3) Targ ...
- javascript 隐性类型转换步骤
这里说的隐性类型转换,是==引起的转换. 如果存在NaN,一律返回false 再看有没有布尔,有布尔就将布尔转换为数字 接着看有没有字符串, 有三种情况,对方是对象,对象使用toString进行转换: ...
- Oracle序列和索引
序列和索引 一.序列 1.序列的概念: 序列(Sequence)是用来生成连续的整数数据的对象.它常常用来作为主键的增长列,可以升序,也可以降序. 2.创建序列: 语法:创建序列 ...
- 12月14日《奥威Power-BI销售计划填报》腾讯课堂开课啦
2016年的最后一个月也过半了,新的一年就要到来,你是否做好了启程的准备?新的一年,有计划,有目标,有方向,才不至于迷茫.规划你的2017,新的一年,遇见更好的自己! 所以 ...
- Android 通过 Wifi 调试 Debug (Android Studio)
参考资料: http://www.cnblogs.com/sunzhenxing19860608/archive/2011/07/14/2106492.html 前提: Android 手机 和 PC ...
- iptables rule
和H3C中的acl很像,或者就是一会事,这就是不知道底层的缺陷,形式一变,所有的积累都浮云了 参考准确的说copy from http://www.ibm.com/developerworks/cn/ ...
- 20145320 《Java程序设计》第1周学习总结
20145320 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 Java最早是Sun公司的项目Green Project中编写Star7应用程序的程序语言,1995年5月2 ...
- 【java开发系列】—— struts2简单入门示例
前言 最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的. struts2其实就是为我们封装了servlet,简化了js ...