SurfaceView

来源:互联网 发布:mac 屏幕睡眠时间 编辑:程序博客网 时间:2024/06/05 02:55

应用场景:

使用VideoView播放视频简单、方便,但除此之外,我们还可以利用MediaPlayer用来播放视频。但是我们知道MediaPlayer主要用于播放音频,它是没有提供输出图像的输出界面,这时我们就用到了SurfaceView控件,将它与MediaPlayer结合起来,就能达到了视频的输出了。首先来了SurfaceView这个控件类

SurfaceView类


 
构造方法
 
常用方法
 
 

它是一个接口,用于管理SurfaceView。里面有两个常用的内部接口SurfaceHolder.Callback,SurfaceHolder.Callback2而Callback2是实现于Callback的

常用方法


SurfaceHolder.CallBack
 
在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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical" >

  6.     <SurfaceView
  7.         android:id="@+id/surfaceView"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="360px" />

  10.     <LinearLayout
  11.         android:layout_width="fill_parent"
  12.         android:layout_height="wrap_content"
  13.         android:gravity="center_horizontal"
  14.         android:orientation="horizontal" >

  15.         <ImageButton
  16.             android:id="@+id/btnplay"
  17.             android:layout_width="wrap_content"
  18.             android:layout_height="wrap_content"
  19.             android:src="@drawable/play" />

  20.         <ImageButton
  21.             android:id="@+id/btnpause"
  22.             android:layout_width="wrap_content"
  23.             android:layout_height="wrap_content"
  24.             android:src="@drawable/pause" />

  25.         <ImageButton
  26.             android:id="@+id/btnstop"
  27.             android:layout_width="wrap_content"
  28.             android:layout_height="wrap_content"
  29.             android:src="@drawable/stop" />
  30.     </LinearLayout>

  31. </LinearLayout>
Activity代码
  1. package com.jiahui.surfaceview;

  2. import android.app.Activity;
  3. import android.media.AudioManager;
  4. import android.media.MediaPlayer;
  5. import android.os.Bundle;
  6. import android.view.SurfaceHolder;
  7. import android.view.SurfaceHolder.Callback;
  8. import android.view.SurfaceView;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. import android.widget.ImageButton;

  13. public class SurfaceViewVideoDemoActivity extends Activity  implements OnClickListener{

  14.         ImageButton btnplay, btnstop, btnpause;
  15.         SurfaceView surfaceView;
  16.         MediaPlayer mediaPlayer;
  17.         int position;

  18.         public void onCreate(Bundle savedInstanceState) {
  19.                 super.onCreate(savedInstanceState);
  20.                 setContentView(R.layout.main);       
  21.                 btnplay=(ImageButton)this.findViewById(R.id.btnplay);
  22.                 btnstop=(ImageButton)this.findViewById(R.id.btnplay);
  23.                 btnpause=(ImageButton)this.findViewById(R.id.btnplay);
  24.                
  25.                 btnstop.setOnClickListener(this);
  26.                 btnplay.setOnClickListener(this);
  27.                 btnpause.setOnClickListener(this);
  28.                
  29.                 mediaPlayer=new MediaPlayer();
  30.                 surfaceView=(SurfaceView) this.findViewById(R.id.surfaceView);
  31.        
  32.                 //设置SurfaceView自己不管理的缓冲区
  33.                 surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);               
  34.                 surfaceView.getHolder().addCallback(new Callback() {               
  35.                         @Override
  36.                         public void surfaceDestroyed(SurfaceHolder holder) {
  37.                
  38.                         }
  39.                
  40.                         @Override
  41.                         public void surfaceCreated(SurfaceHolder holder) {
  42.                                 if (position>0) {
  43.                                         try {
  44.                                                 //开始播放
  45.                                                 play();
  46.                                                 //并直接从指定位置开始播放
  47.                                                 mediaPlayer.seekTo(position);
  48.                                                 position=0;                                               
  49.                                         } catch (Exception e) {
  50.                                                 // TODO: handle exception
  51.                                         }
  52.                                 }
  53.                         }                       
  54.                         @Override
  55.                         public void surfaceChanged(SurfaceHolder holder, int format, int width,
  56.                                         int height) {

  57.                         }
  58.                 });               
  59.         }
  60.         @Override
  61.         public void onClick(View v) {       
  62.                 switch (v.getId()) {
  63.                 case R.id.btnplay:
  64.                         play();
  65.                         break;
  66.                        
  67.                 case R.id.btnpause:
  68.                         if (mediaPlayer.isPlaying()) {
  69.                                 mediaPlayer.pause();
  70.                         }else{
  71.                                 mediaPlayer.start();
  72.                         }
  73.                         break;

  74.                 case R.id.btnstop:
  75.                         if (mediaPlayer.isPlaying()) {
  76.                                 mediaPlayer.stop();
  77.                         }
  78.                        
  79.                         break;
  80.                 default:
  81.                         break;
  82.                 }

  83.         }
  84.         @Override
  85.         protected void onPause() {       
  86.                 //先判断是否正在播放
  87.                 if (mediaPlayer.isPlaying()) {
  88.                         //如果正在播放我们就先保存这个播放位置
  89.                         position=mediaPlayer.getCurrentPosition()
  90.                                         ;
  91.                         mediaPlayer.stop();
  92.                 }
  93.                 super.onPause();
  94.         }

  95.         private void play() {
  96.                 try {
  97.                         mediaPlayer.reset();
  98.                         mediaPlayer
  99.                         .setAudioStreamType(AudioManager.STREAM_MUSIC);
  100.                         //设置需要播放的视频
  101.                         mediaPlayer.setDataSource("/mnt/sdcard/movie.3gp");
  102.                         //把视频画面输出到SurfaceView
  103.                         mediaPlayer.setDisplay(surfaceView.getHolder());
  104.                         mediaPlayer.prepare();
  105.                         //播放
  106.                         mediaPlayer.start();               
  107.                 } catch (Exception e) {
  108.                         // TODO: handle exception
  109.                 }
  110.         }
  111. }
0 0