Android SurfaceView
2024-08-25 15:36:21
今天介绍一下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;
}
});
}
}
最新文章
- JDBC操作数据库,第一:jsp插入mysql数据库,坎坷摸索分享
- hdu 4272 2012长春赛区网络赛 dfs暴力 ***
- Oracle中快速查询和操作某个用户下的所有表数据信息
- 如何快速开发出一个高质量的APP——创业谈
- Visual C++ 设置适合自己的解决方案目录结构
- GridView不換行
- 【CSS】Beginner3:Color
- JVM虚拟机栈和本地方法栈溢出测试
- Hadoop学习笔记——入门指令操作
- java nio 网络框架实现(转)
- JavaFX引入资源问题
- Linux下定时备份文件
- HanLP 自然语言处理 for nodejs
- AJAX方式发送远程请求报错:No 'Access-Control-Allow-Origin' header
- java学习之—递归
- 《深入理解Java虚拟机》读书笔记:垃圾收集器与内存分配策略
- C++学习(三)(C语言部分)之 基本数据类型
- iOS 坐标转换
- C++:为什么unique_ptr的Deleter是模板类型参数,而shared_ptr的Deleter不是?
- (二进制 异或)Team Formation --ZOJ --3870
热门文章
- How to run a (Tomcat)Java application server on a Azure virtual machine
- Java:String和Date、Timestamp之间的转
- Master page and jquery
- 原生JS--Ajax
- Android官方数据绑定框架DataBinding
- 解决安装完centos6.6之后/etc/sysconfig/目录下没有iptables 的问题
- pip 添加trusted host 一劳永逸
- chrome的timeline中stalled问题解析
- Install Google Pinyin on Ubuntu 14.04
- JQuery中对各种域进行隐藏和显示操作