Android之SurfaceView的简单介绍
2016-07-06 20:03
543 查看
SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作。
要使用SurfaceView进行绘制,步骤如下:
1.用SurfaceView进行绘制,首先要创建一个对象。
2.对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用
int format, int width, int height),surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder))分别对应Surface何时更改、创建和销毁。
3.在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。
4.绘制:在线程类的run()方法中进行绘制操作,通过
关键代码:
布局:
Activity中:
要使用SurfaceView进行绘制,步骤如下:
1.用SurfaceView进行绘制,首先要创建一个对象。
2.对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用
getHolder()来获得SurfaceHolder对象,然后用addCallback()加上回调接口(因为你的类实现了相应的接口,所以此处传入this即可)。这个接口中实现的三个回调函数(surfaceChanged(SurfaceHolder holder,
int format, int width, int height),surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder))分别对应Surface何时更改、创建和销毁。
3.在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。
4.绘制:在线程类的run()方法中进行绘制操作,通过
lockCanvas()方法获得Canvas对象,然后就可以用这个对象进行绘制,绘制完成后调用unlockCanvasAndPost(),传入Canvas对象,这时Surface将会按Canvas进行绘制。
关键代码:
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sv"/> </LinearLayout>
Activity中:
//要知道SurfaceView什么时候是完全绘制完成的 surfaceView.getHolder().addCallback(new Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub System.out.println("created"); new Thread(){ public void run() { for(int i=0;i<=360;i++){ SurfaceHolder surfaceHolder=surfaceView.getHolder(); //锁住画布 Canvas canvas=surfaceHolder.lockCanvas(); Paint paint=new Paint(); paint.setColor(Color.RED); canvas.drawArc(new RectF(50, 50, 400,400), 0, i, true, paint); //通知界面更新 surfaceHolder .unlockCanvasAndPost(canvas); } }; }.start(); }
相关文章推荐
- Python动态类型的学习---引用的理解
- 土人系列AS入门教程 -- 对象篇
- C#托管堆对象实例包含内容分析
- C#线程间不能调用剪切板的解决方法
- C#实现获取不同对象中名称相同属性的方法
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- VBS教程:对象-正则表达式(RegExp)对象
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- C#编程自学之类和对象
- C++中对象的常引用、动态建立和释放相关知识讲解
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码