今天介绍一下SurfaceView的用法,SurfaceView一般与SurfaceHolder结合使用,SurfaceHolder用于向与之关联的SurfaceView上绘图,调用SurfaceView的getHolder()方法即可获取SurfaceView关联的SurfaceHolder。

SurfaceHolder提供一下几个方法来获取Canvas对象:

Canvas lockCanvas():锁定整个SurfaceView对象,获取该Surface上的Canvas。

Canvas lockCanvas(Rect dirty):锁定SurfaceView上Rect划分的区域,获取该Surface上的Canvas。

当通过lockCanvas获取指定SurfaceView上的Canvas之后,接下来程序就可以调用Canvas进行绘图,绘图完成后,调用一下方法来释放绘图、提交所绘制的图形:

unlockCanvasAndPost(canvas)。

下面直接上个实例:

 public class SurfaceViewTest extends Activity
{
// SurfaceHolder负责维护SurfaceView上绘制的内容
private SurfaceHolder holder;
private Paint paint;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
paint = new Paint();
SurfaceView surface = (SurfaceView) findViewById(R.id.show);
// 初始化SurfaceHolder对象
holder = surface.getHolder();
holder.addCallback(new Callback()
{
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3)
{
} @Override
public void surfaceCreated(SurfaceHolder holder)
{
// 锁定整个SurfaceView
Canvas canvas = holder.lockCanvas();
// 绘制背景
Bitmap back = BitmapFactory.decodeResource(
SurfaceViewTest.this.getResources(), R.drawable.sun);
//绘制背景
canvas.drawBitmap(back, 0, 0, null);
// 绘制完成,释放画布,提交修改
holder.unlockCanvasAndPost(canvas);
//重新锁一次,"持久化"上次所绘制的内容
holder.lockCanvas(new Rect(0, 0, 0, 0));
holder.unlockCanvasAndPost(canvas);
} @Override
public void surfaceDestroyed(SurfaceHolder holder)
{
}
});
//为surface的触摸事件绑定监听器
surface.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View source, MotionEvent event)
{
// 只处理按下事件
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
int cx = (int) event.getX();
int cy = (int) event.getY();
// 锁定SurfaceView的局部区域,只更新局部内容
Canvas canvas = holder.lockCanvas(new Rect(cx - 50,
cy - 50, cx + 50, cy + 50));
// 保存canvas的当前状态
canvas.save();
// 旋转画布
canvas.rotate(30, cx, cy);
paint.setColor(Color.RED);
// 绘制红色方块
canvas.drawRect(cx - 40, cy - 40, cx, cy, paint);
// 恢复Canvas之前的保存状态
canvas.restore();
paint.setColor(Color.GREEN);
// 绘制绿色方块
canvas.drawRect(cx, cy, cx + 40, cy + 40, paint);
// 绘制完成,释放画布,提交修改
holder.unlockCanvasAndPost(canvas);
}
return false;
}
});
}
}

最新文章

  1. JDBC操作数据库,第一:jsp插入mysql数据库,坎坷摸索分享
  2. hdu 4272 2012长春赛区网络赛 dfs暴力 ***
  3. Oracle中快速查询和操作某个用户下的所有表数据信息
  4. 如何快速开发出一个高质量的APP——创业谈
  5. Visual C++ 设置适合自己的解决方案目录结构
  6. GridView不換行
  7. 【CSS】Beginner3:Color
  8. JVM虚拟机栈和本地方法栈溢出测试
  9. Hadoop学习笔记——入门指令操作
  10. java nio 网络框架实现(转)
  11. JavaFX引入资源问题
  12. Linux下定时备份文件
  13. HanLP 自然语言处理 for nodejs
  14. AJAX方式发送远程请求报错:No 'Access-Control-Allow-Origin' header
  15. java学习之—递归
  16. 《深入理解Java虚拟机》读书笔记:垃圾收集器与内存分配策略
  17. C++学习(三)(C语言部分)之 基本数据类型
  18. iOS 坐标转换
  19. C++:为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是?
  20. (二进制 异或)Team Formation --ZOJ --3870

热门文章

  1. How to run a (Tomcat)Java application server on a Azure virtual machine
  2. Java:String和Date、Timestamp之间的转
  3. Master page and jquery
  4. 原生JS--Ajax
  5. Android官方数据绑定框架DataBinding
  6. 解决安装完centos6.6之后/etc/sysconfig/目录下没有iptables 的问题
  7. pip 添加trusted host 一劳永逸
  8. chrome的timeline中stalled问题解析
  9. Install Google Pinyin on Ubuntu 14.04
  10. JQuery中对各种域进行隐藏和显示操作