Surfaceview的特点以及和View的区别:
- View 主要适用于主动更新的情况,而 surfaceView 主要适用于被动更新,例如频繁的刷新。
- View 在主线程中对画面进行刷新,而 surfaceView 通常会通过一个子线程来进行页面的刷新
- View 在绘图时没有使用双缓冲机制,而 surfaceView 在底层实现机制上就已经实现了双缓冲机制。
- 特点:频繁的更新UI,原因是双缓冲机制
功能:
- 1 播放视频
- 2.绘制滚动的图形:画圆 画线 画矩形 画图片 画文字
- 3.画板功能:截图之后可以涂鸦
- 4.歌词滚动
播放视频:
添加接口回调,能够获取surfaceview的生命周期(this不是上下文对象)
surfaceHolder.addCallback(this);
implements SurfaceHolder.Callback会重写三个方法
public class SurfaceViewActivity extends AppCompatActivity implements SurfaceHolder.Callback {
SurfaceView surfaceView;//控件 一个Surfaceview 对应一个surfaceHolder
SurfaceHolder surfaceHolder;//持有者,不能直接操作SurfaceView,通过他的SurfaceHolder来操作,
MediaPlayer mediaPlayer=new MediaPlayer();//媒体资源对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_surface_view);
initView();
initPalyer();
}
private void initView() {
surfaceView=findViewById(R.id.surface);
surfaceHolder=surfaceView.getHolder();
surfaceHolder.addCallback(this);//添加接口回调,能够获取surfaceview的生命周期
}
//初始化mediaplayer
private void initPalyer() {
try {
mediaPlayer.setDataSource("http://uvideo.spriteapp.cn/video/2019/0512/56488d0a-7465-11e9-b91b-1866daeb0df1_wpd.mp4");
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
//生命周期:创建 将mediaplayer和surfaceholder绑定一起,
@Override
public void surfaceCreated(SurfaceHolder holder) {
mediaPlayer.setDisplay(surfaceHolder);//将mediapler显示在surfaceview
}
//改变
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
//销毁
@Override
public void surfaceDestroyed(Surf