您的位置:首页 > 移动开发 > Android开发

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,如下:

 <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创建完毕,之后调用的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: