前言

  本章继续完善播放相关播放器的核心功能,为后续扩展打好基础。 声明   欢迎转载,但请保留文章原始出处:)     博客园:http://www.cnblogs.com     农民伯伯: http://over140.cnblogs.com

系列   1、 使用Vitamio打造自己的Android万能播放器(1)——准备

正文

  一、实现目标

1.1 亮度控制

模仿VPlayer界面:

1.2 声音控制

模仿VPlayer界面:


1.3 画面缩放

根据下面API提供画面的拉伸、剪切、100%、全屏

  二、Vitamio API 介绍

VideoView

2.1 public void start()

开始播放

2.2 public void pause()

暂停播放

2.3 public long getDuration()

获取视频的时长

2.4 public long getCurrentPosition()

获取已经播放的时长

2.5 public void seekTo(long msec)

设置播放器从指定的位置开始播放

2.6 public boolean isPlaying()

是否正在播放

2.7 public int getVideoWidth()

获取视频宽

2.8 public int getVideoHeight()

获取视频高

2.9 public void setBufferSize(int bufSize)

设置缓存大小,默认1024KB

2.10 public void setVideoQuality(int quality)

设置视频质量,低、中、高(MediaPlayer.VIDEOQUALITY_LOW、MediaPlayer.VIDEOQUALITY_MEDIUM、MediaPlayer.VIDEOQUALITY_HIGH),

默认低(最流畅)。

2.11 public void setSubShown(boolean shown)

设置是否显示字幕

2.12 public void setAudioTrack(int audioIndex)

设置音轨,必须是getAudioTrackMap(String)的返回值。

2.13 public void setVolume(float leftVolume, float rightVolume)

设置立体音左右音量。

2.14 public void setSubPath(String subPath)

设置外挂字幕路径

2.15 public int getBufferPercentage()

获取缓冲百分比

2.16 public void stopPlayback()

停止播放

2.17 public void setVideoPath(String path)

设置视频播放路径

2.18 public void setVideoURI(Uri uri)

设置视频播放路径

2.19 public void setVideoLayout(int layout, float aspectRatio)

设置视频缩放(拉伸、剪切、100%、全屏)

  三、实现代码

3.1 xml

<? xmlversion="1.0"encoding="utf-8" ?>
< RelativeLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation
="vertical" android:layout_width ="match_parent"
android:layout_height
="match_parent" >
< io.vov.vitamio.widget.VideoView
android:id ="@+id/surface_view" android:layout_width ="match_parent"
android:layout_height
="match_parent" android:layout_centerHorizontal ="true"
android:layout_centerVertical
="true" />
< FrameLayout android:id ="@+id/operation_volume_brightness"
android:visibility
="invisible" android:layout_centerInParent ="true"
android:layout_width
="wrap_content" android:layout_height ="wrap_content"
android:background
="#00000000" android:orientation ="horizontal"
android:padding
="0dip" >
< ImageView android:id ="@+id/operation_bg"
android:layout_gravity
="center" android:src ="@drawable/video_volumn_bg"
android:layout_width
="wrap_content" android:layout_height ="wrap_content" />
< FrameLayout android:layout_gravity ="bottom|center_horizontal"
android:layout_width
="wrap_content" android:layout_height ="wrap_content"
android:paddingBottom
="25dip" >
< ImageView android:id ="@+id/operation_full"
android:layout_gravity
="left" android:src ="@drawable/video_num_bg"
android:layout_width
="94dip" android:layout_height ="wrap_content" />
< ImageView android:id ="@+id/operation_percent"
android:layout_gravity
="left" android:src ="@drawable/video_num_front"
android:layout_width
="0dip" android:layout_height ="wrap_content"
android:scaleType
="matrix" />
</ FrameLayout >
</ FrameLayout >

</RelativeLayout>

3.2 Activity

/**
*
*Android万能播放器
*
*
@author 农民伯伯
*
@version 2012-5-22
*
*/
public classVideoViewDemo extendsActivity{

privateStringpath=Environment.getExternalStorageDirectory()
+"/Moon.mp4";
privateVideoViewmVideoView;
privateViewmVolumeBrightnessLayout;
privateImageViewmOperationBg;
privateImageViewmOperationPercent;
privateAudioManagermAudioManager;
/** 最大声音 */
private intmMaxVolume;
/** 当前声音 */
private intmVolume=-1;
/** 当前亮度 */
private floatmBrightness=-1f;
/** 当前缩放模式 */
private intmLayout=VideoView.VIDEO_LAYOUT_ZOOM;
privateGestureDetectormGestureDetector;
privateMediaControllermMediaController;

@Override
public voidonCreate(Bundleicicle){
super.onCreate(icicle);
setContentView(R.layout.videoview);
mVideoView=(VideoView)findViewById(R.id.surface_view);
mVolumeBrightnessLayout=findViewById(R.id.operation_volume_brightness);
mOperationBg=(ImageView)findViewById(R.id.operation_bg);
mOperationPercent=(ImageView)findViewById(R.id.operation_percent);

mAudioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
mMaxVolume=mAudioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mVideoView.setVideoPath(path);
mMediaController= newMediaController( this);
mVideoView.setMediaController(mMediaController);
mVideoView.requestFocus();

mGestureDetector= newGestureDetector( this, newMyGestureListener());
}

@Override
public booleanonTouchEvent(MotionEventevent){
if(mGestureDetector.onTouchEvent(event))
return true;

// 处理手势结束
switch(event.getAction()&MotionEvent.ACTION_MASK){
caseMotionEvent.ACTION_UP:
endGesture();
break;
}

return super.onTouchEvent(event);
}

/** 手势结束 */
private voidendGesture(){
mVolume=-1;
mBrightness=-1f;

// 隐藏
mDismissHandler.removeMessages(0);
mDismissHandler.sendEmptyMessageDelayed(0,500);
}

private classMyGestureListener extendsSimpleOnGestureListener{

/** 双击 */
@Override
public booleanonDoubleTap(MotionEvente){
if(mLayout==VideoView.VIDEO_LAYOUT_ZOOM)
mLayout=VideoView.VIDEO_LAYOUT_ORIGIN;
else
mLayout++;
if(mVideoView!= null)
mVideoView.setVideoLayout(mLayout,0);
return true;
}

/** 滑动 */
@Override
public booleanonScroll(MotionEvente1,MotionEvente2,
floatdistanceX, floatdistanceY){
floatmOldX=e1.getX(),mOldY=e1.getY();
inty=( int)e2.getRawY();
Displaydisp=getWindowManager().getDefaultDisplay();
intwindowWidth=disp.getWidth();
intwindowHeight=disp.getHeight();

if(mOldX>windowWidth*4.0/5) // 右边滑动
onVolumeSlide((mOldY-y)/windowHeight);
else if(mOldX<windowWidth/5.0) // 左边滑动
onBrightnessSlide((mOldY-y)/windowHeight);

return super.onScroll(e1,e2,distanceX,distanceY);
}
}

/** 定时隐藏 */
privateHandlermDismissHandler= newHandler(){
@Override
public voidhandleMessage(Messagemsg){
mVolumeBrightnessLayout.setVisibility(View.GONE);
}
};

/**
*滑动改变声音大小
*
*
@param percent
*/
private voidonVolumeSlide( floatpercent){
if(mVolume==-1){
mVolume=mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
if(mVolume<0)
mVolume=0;

// 显示
mOperationBg.setImageResource(R.drawable.video_volumn_bg);
mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
}

intindex=( int)(percent*mMaxVolume)+mVolume;
if(index>mMaxVolume)
index=mMaxVolume;
else if(index<0)
index=0;

// 变更声音
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,index,0);

// 变更进度条
ViewGroup.LayoutParamslp=mOperationPercent.getLayoutParams();
lp.width=findViewById(R.id.operation_full).getLayoutParams().width
*index/mMaxVolume;
mOperationPercent.setLayoutParams(lp);
}

/**
*滑动改变亮度
*
*
@param percent
*/
private voidonBrightnessSlide( floatpercent){
if(mBrightness<0){
mBrightness=getWindow().getAttributes().screenBrightness;
if(mBrightness<=0.00f)
mBrightness=0.50f;
if(mBrightness<0.01f)
mBrightness=0.01f;

// 显示
mOperationBg.setImageResource(R.drawable.video_brightness_bg);
mVolumeBrightnessLayout.setVisibility(View.VISIBLE);
}
WindowManager.LayoutParamslpa=getWindow().getAttributes();
lpa.screenBrightness=mBrightness+percent;
if(lpa.screenBrightness>1.0f)
lpa.screenBrightness=1.0f;
else if(lpa.screenBrightness<0.01f)
lpa.screenBrightness=0.01f;
getWindow().setAttributes(lpa);

ViewGroup.LayoutParamslp=mOperationPercent.getLayoutParams();
lp.width=( int)(findViewById(R.id.operation_full).getLayoutParams().width*lpa.screenBrightness);
mOperationPercent.setLayoutParams(lp);
}

@Override
public voidonConfigurationChanged(ConfigurationnewConfig){
if(mVideoView!= null)
mVideoView.setVideoLayout(mLayout,0);
super.onConfigurationChanged(newConfig);
}

}

3.3 代码说明

3.3.1 缩放功能

该功能SDK已经提供好了接口,直接使用即可。

3.3.2 音量和亮度控制实现

根据layout可以看得出,利用FrameLayout的特点(后面视图会覆盖前面视图),通过控制后一个视图的宽度来达到进度条的效果。

3.3.3 自动隐藏

可用Handle来实现自定延时隐藏的功能,比较实用。

3.3.4 手势

手势方面大家可用多查查GestureDetector方面的资料,双击、缩放手势都可以实现。

  四、代码下载

请移步#Taocode(SVN):(没有账户的请注册一个账户即可。)

项目地址:http://code.taobao.org/p/oplayer

  五、Vitamio相关信息

5.1 近期将发布新的SDK版本

5.1.1 将直接内置各平台解码器,无需外下载!

5.1.2 将支持自定义进度控制条等。

  六、相关文章

6.1 Android 播放电影时滑动屏幕调整屏幕亮度

6.2 android MediaPlayer API

结束

  本系列文章承诺每周至少出一篇,以帮助需要的朋友尽快将Vitamio融合入自己或公司的项目中。

更多相关文章

  1. 【Android(安卓)Developers Training】 36. 设置文件共享
  2. android开发教程之listview使用方法
  3. 轻松使用xmlpull解析xml
  4. android开发之滑动效果实现图片浏览_ViewFilpper的使用
  5. Android(安卓)theme 使用
  6. Android在一个app中启动其他app中的service或者Activity
  7. Android:TabLayout向上滑动停留页面顶部
  8. Android中WebView用法实例分析
  9. [android之旅]环境搭建中的一些问题

随机推荐

  1. C语言输入两个数如何输出最大的数?
  2. c++中判断重载方法的依据是什么
  3. C语言中在main函数中定义的变量是全局变
  4. exit(0)在c语言中是什么意思
  5. const用法是什么?
  6. C语言中输出字符串用什么符号
  7. c语言输入五个数如何求平均值?
  8. c语言根号函数是什么
  9. c语言大于等于怎么打?
  10. c程序中宏展开是在什么时候进行的?