Android(java)学习笔记244:多媒体之SurfaceView
2015-09-13 19:56
615 查看
1. SurfaceView:
完成单位时间内界面的快速切换(游戏界面流畅感)。
我们之前知道一般的View,只能在主线程里面显示,主线程中更新UI。但是SurfaceView可以在子线程中里面更新UI。
SurfaceView内置了双缓冲的技术,SurfaceView一旦启动,就会对应两个线程(线程A 和 线程B);
(1)线程A是前台,线程B是后台线程;
(2)线程A开始进行UI显示,(与此同时)线程B计算处理下一个UI的显示,A执行完了,B也执行完了;
(3)这时候,线程A和线程B快速切换角色,这时候线程B是前台进程,线程A是后台进程;
(4)这时候,线程B前台显示UI,线程A后台计算处理;B执行完了,A也执行完了;
(5)[b]这时候,线程B和线程A快速切换角色,这时候线程A是前台进程,线程B是后台进程;[/b]
(6)如此反复;
2.案例演示使用SurfaceView,如下:
(1)activity_main.xml,如下:
(2)MainActivity,如下:
SurfaceView的这个控件,内存开销比较大;如果把SurfaceView放到onCreate里面会容易产生出现空指针,因为onCreate中调用SurfaceView的时候,可能SurfaceView还没有创建好,调用它当然就是空指针异常。
这里利用SurfaceHolder的一个API,就是addCallback(……),这里接口实现类有个方法是:
public void surfaceCreated(SurfaceHolder holder),它就是在SurfaceView创建完毕,之后调用的方法。
完成单位时间内界面的快速切换(游戏界面流畅感)。
我们之前知道一般的View,只能在主线程里面显示,主线程中更新UI。但是SurfaceView可以在子线程中里面更新UI。
SurfaceView内置了双缓冲的技术,SurfaceView一旦启动,就会对应两个线程(线程A 和 线程B);
(1)线程A是前台,线程B是后台线程;
(2)线程A开始进行UI显示,(与此同时)线程B计算处理下一个UI的显示,A执行完了,B也执行完了;
(3)这时候,线程A和线程B快速切换角色,这时候线程B是前台进程,线程A是后台进程;
(4)这时候,线程B前台显示UI,线程A后台计算处理;B执行完了,A也执行完了;
(5)[b]这时候,线程B和线程A快速切换角色,这时候线程A是前台进程,线程B是后台进程;[/b]
(6)如此反复;
2.案例演示使用SurfaceView,如下:
(1)activity_main.xml,如下:
<RelativeLayout 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" tools:context=".MainActivity" > <SurfaceView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:id="@+id/sv"/> </RelativeLayout>
(2)MainActivity,如下:
package com.itheima.surfaceview; import android.os.Bundle; import android.app.Activity; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Menu; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.View; public class MainActivity extends Activity { private SurfaceView sv; private Paint paint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sv = (SurfaceView) findViewById(R.id.sv); // 舞台 paint = new Paint(); paint.setColor(Color.RED); final SurfaceHolder holder = sv.getHolder(); // 导演, 导演控制如何显示。 holder.addCallback(new Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { System.out.println("界面被销毁了"); } @Override public void surfaceCreated(final SurfaceHolder holder) { System.out.println("界面才被创建出来"); new Thread() { public void run() { for (int i = 0; i < 500; i++) { Canvas canvas = holder.lockCanvas(); canvas.drawCircle(200, 200, i, paint); holder.unlockCanvasAndPost(canvas); try { Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); } }
SurfaceView的这个控件,内存开销比较大;如果把SurfaceView放到onCreate里面会容易产生出现空指针,因为onCreate中调用SurfaceView的时候,可能SurfaceView还没有创建好,调用它当然就是空指针异常。
这里利用SurfaceHolder的一个API,就是addCallback(……),这里接口实现类有个方法是:
public void surfaceCreated(SurfaceHolder holder),它就是在SurfaceView创建完毕,之后调用的方法。
相关文章推荐
- Caused by: android.os.NetworkOnMainThreadException错误解决办法
- Android 异常记录
- Android实现FTP客户端服务端多图下载【两部android手机之间传输】
- android 自定义圆角imageview
- <Android Framework 之路>Android5.1 Camera Framework(四)——框架总结
- Android5.1 Camera Framework(四)——框架总结
- [转]Android x86模拟器Intel Atom x86 System Image配置与使用方法
- Android:30分钟弄明白Touch事件分发机制
- 破解android手机付费软件视频教程
- Android图片压缩工具类
- Android图片压缩工具类
- Android开发从零开始笔记
- Android中Intent概述及使用
- Android(java)学习笔记243:多媒体之视频播放器
- Class.getResourceAsStream与ClassLoader.getResourceAsStream总结
- Android安全-代码安全1-ProGuard混淆处理
- Android 没有SD卡,利用手机存储下载、自动安装,解决Parse error when parsing manifest问题
- Android中联系人和通话记录详解(1)
- Google《Android性能优化》学习笔记链接
- Android:View绘制流程