SurfaceView
来源:互联网 发布:mac 屏幕睡眠时间 编辑:程序博客网 时间:2024/06/05 02:55
应用场景:
使用VideoView播放视频简单、方便,但除此之外,我们还可以利用MediaPlayer用来播放视频。但是我们知道MediaPlayer主要用于播放音频,它是没有提供输出图像的输出界面,这时我们就用到了SurfaceView控件,将它与MediaPlayer结合起来,就能达到了视频的输出了。首先来了SurfaceView这个控件类
SurfaceView类
构造方法
常用方法
它是一个接口,用于管理SurfaceView。里面有两个常用的内部接口SurfaceHolder.Callback,SurfaceHolder.Callback2而Callback2是实现于Callback的
常用方法
SurfaceHolder.CallBack
如何理解这几个类或者接口之间的关系?
这样理解:
SurfaceView它用于显示,SurfaceHolder就是用于用来管理这个显示的SurfaceView对象的,但在SurfaceHolder是怎么样去管理这个对象的呢?这就用到了SurfceHolder.addCallback()方法添加一个SurfaceHolder接口的内部接口的三个抽象方法用于管理或者说是用于监听SurfaceView。这样就达到了管理SurfaceView的目的。
实例:使用MediaPlayer与SurfaceView播放视频
实现效果:
实现步骤:
1) 创建MediaPlayer对象,并设置加载的视频文件(setDataSource())
2) 在界面布局文件中定义SurfaceView控件
3) 通过MediaPlayer.setDisplay(SurfaceHolder sh)来指定视频画面输出到SurfaceView之上
4) 通过MediaPlayer的其他一些方法用于播放视频
代码实现:
布局文件:main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <SurfaceView
- android:id="@+id/surfaceView"
- android:layout_width="fill_parent"
- android:layout_height="360px" />
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:orientation="horizontal" >
- <ImageButton
- android:id="@+id/btnplay"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/play" />
- <ImageButton
- android:id="@+id/btnpause"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/pause" />
- <ImageButton
- android:id="@+id/btnstop"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/stop" />
- </LinearLayout>
- </LinearLayout>
- package com.jiahui.surfaceview;
- import android.app.Activity;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.os.Bundle;
- import android.view.SurfaceHolder;
- import android.view.SurfaceHolder.Callback;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageButton;
- public class SurfaceViewVideoDemoActivity extends Activity implements OnClickListener{
- ImageButton btnplay, btnstop, btnpause;
- SurfaceView surfaceView;
- MediaPlayer mediaPlayer;
- int position;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btnplay=(ImageButton)this.findViewById(R.id.btnplay);
- btnstop=(ImageButton)this.findViewById(R.id.btnplay);
- btnpause=(ImageButton)this.findViewById(R.id.btnplay);
-
- btnstop.setOnClickListener(this);
- btnplay.setOnClickListener(this);
- btnpause.setOnClickListener(this);
-
- mediaPlayer=new MediaPlayer();
- surfaceView=(SurfaceView) this.findViewById(R.id.surfaceView);
-
- //设置SurfaceView自己不管理的缓冲区
- surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- surfaceView.getHolder().addCallback(new Callback() {
- @Override
- public void surfaceDestroyed(SurfaceHolder holder) {
-
- }
-
- @Override
- public void surfaceCreated(SurfaceHolder holder) {
- if (position>0) {
- try {
- //开始播放
- play();
- //并直接从指定位置开始播放
- mediaPlayer.seekTo(position);
- position=0;
- } catch (Exception e) {
- // TODO: handle exception
- }
- }
- }
- @Override
- public void surfaceChanged(SurfaceHolder holder, int format, int width,
- int height) {
- }
- });
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.btnplay:
- play();
- break;
-
- case R.id.btnpause:
- if (mediaPlayer.isPlaying()) {
- mediaPlayer.pause();
- }else{
- mediaPlayer.start();
- }
- break;
- case R.id.btnstop:
- if (mediaPlayer.isPlaying()) {
- mediaPlayer.stop();
- }
-
- break;
- default:
- break;
- }
- }
- @Override
- protected void onPause() {
- //先判断是否正在播放
- if (mediaPlayer.isPlaying()) {
- //如果正在播放我们就先保存这个播放位置
- position=mediaPlayer.getCurrentPosition()
- ;
- mediaPlayer.stop();
- }
- super.onPause();
- }
- private void play() {
- try {
- mediaPlayer.reset();
- mediaPlayer
- .setAudioStreamType(AudioManager.STREAM_MUSIC);
- //设置需要播放的视频
- mediaPlayer.setDataSource("/mnt/sdcard/movie.3gp");
- //把视频画面输出到SurfaceView
- mediaPlayer.setDisplay(surfaceView.getHolder());
- mediaPlayer.prepare();
- //播放
- mediaPlayer.start();
- } catch (Exception e) {
- // TODO: handle exception
- }
- }
- }
- surfaceview
- SurfaceView
- surfaceview
- surfaceview
- SurfaceView
- SurfaceView
- SurfaceView
- SurfaceView
- SurfaceView
- SurfaceView
- SurfaceView
- surfaceview
- SurfaceView
- SurfaceView
- SurfaceView
- surfaceview
- surfaceview
- SurfaceView
- openlldp-0.4alpha实现详解(四)——rx_sm模块
- Redis和Memcache对比及选择
- jquery pop弹出框和锁屏
- 条件编译 实现 android和windows上线程创建
- 使用非阻塞ServerSocketChannel、SocketChannel代替ServerSocket和Socket
- SurfaceView
- 堆 和 栈的 区别(经典)
- 图结构练习——BFS——从起始点到目标点的最短步数(bfs)
- BZOJ 1000: A+B Problem
- 黄金队列 蓝桥杯
- Android4.0中AppWidget的一些新玩意体验
- [中间件] 消息处理利器 ActiveMQ 的介绍 & Stomp 协议的使用
- 低级错误
- c++ std - accumulate 求数组和