Android 使用Vitamio打造自己的萬能播放器(2)—— 手勢控制亮度、音量、縮放
前言
本章繼續(xù)完善播放相關(guān)播放器的核心功能,為后續(xù)擴(kuò)展打好基礎(chǔ)。
系列
1、Android 使用Vitamio打造自己的萬能播放器(1)——準(zhǔn)備
正文
一、實現(xiàn)目標(biāo)
1.1 亮度控制
模仿VPlayer界面:
1.2 聲音控制
模仿VPlayer界面:
1.3 畫面縮放
根據(jù)下面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()
獲取已經(jīng)播放的時長
2.5 public void seekTo(long msec)
設(shè)置播放器從指定的位置開始播放
2.6 public boolean isPlaying()
是否正在播放
2.7 public int getVideoWidth()
獲取視頻寬
2.8 public int getVideoHeight()
獲取視頻高
2.9 public void setBufferSize(int bufSize)
設(shè)置緩存大小,默認(rèn)1024KB
2.10 public void setVideoQuality(int quality)
設(shè)置視頻質(zhì)量,低、中、高(MediaPlayer.VIDEOQUALITY_LOW、MediaPlayer.VIDEOQUALITY_MEDIUM 、MediaPlayer.VIDEOQUALITY_HIGH ),
默認(rèn)低(最流暢)。
2.11 public void setSubShown(boolean shown)
設(shè)置是否顯示字幕
2.12 public void setAudioTrack(int audioIndex)
設(shè)置音軌,必須是getAudioTrackMap(String) 的返回值。
2.13 public void setVolume(float leftVolume, float rightVolume)
設(shè)置立體音左右音量。
2.14 public void setSubPath(String subPath)
設(shè)置外掛字幕路徑
2.15 public int getBufferPercentage()
獲取緩沖百分比
2.16 public void stopPlayback()
停止播放
2.17 public void setVideoPath(String path)
設(shè)置視頻播放路徑
2.18 public void setVideoURI(Uri uri)
設(shè)置視頻播放路徑
2.19 public void setVideoLayout(int layout, float aspectRatio)
設(shè)置視頻縮放(拉伸、剪切、100%、全屏)
三、 實現(xiàn)代碼
3.1 xml
<?xml version="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萬能播放器 * * */ public class VideoViewDemo extends Activity { private String path = Environment.getExternalStorageDirectory() + "/Moon.mp4"; private VideoView mVideoView; private View mVolumeBrightnessLayout; private ImageView mOperationBg; private ImageView mOperationPercent; private AudioManager mAudioManager; /** 最大聲音 */ private int mMaxVolume; /** 當(dāng)前聲音 */ private int mVolume = -1; /** 當(dāng)前亮度 */ private float mBrightness = -1f; /** 當(dāng)前縮放模式 */ private int mLayout = VideoView.VIDEO_LAYOUT_ZOOM; private GestureDetector mGestureDetector; private MediaController mMediaController; @Override public void onCreate(Bundle icicle) { 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 = new MediaController(this); mVideoView.setMediaController(mMediaController); mVideoView.requestFocus(); mGestureDetector = new GestureDetector(this, new MyGestureListener()); } @Override public boolean onTouchEvent(MotionEvent event) { if (mGestureDetector.onTouchEvent(event)) return true; // 處理手勢結(jié)束 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_UP: endGesture(); break; } return super.onTouchEvent(event); } /** 手勢結(jié)束 */ private void endGesture() { mVolume = -1; mBrightness = -1f; // 隱藏 mDismissHandler.removeMessages(0); mDismissHandler.sendEmptyMessageDelayed(0, 500); } private class MyGestureListener extends SimpleOnGestureListener { /** 雙擊 */ @Override public boolean onDoubleTap(MotionEvent e) { if (mLayout == VideoView.VIDEO_LAYOUT_ZOOM) mLayout = VideoView.VIDEO_LAYOUT_ORIGIN; else mLayout++; if (mVideoView != null) mVideoView.setVideoLayout(mLayout, 0); return true; } /** 滑動 */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { float mOldX = e1.getX(), mOldY = e1.getY(); int y = (int) e2.getRawY(); Display disp = getWindowManager().getDefaultDisplay(); int windowWidth = disp.getWidth(); int windowHeight = 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); } } /** 定時隱藏 */ private Handler mDismissHandler = new Handler() { @Override public void handleMessage(Message msg) { mVolumeBrightnessLayout.setVisibility(View.GONE); } }; /** * 滑動改變聲音大小 * * @param percent */ private void onVolumeSlide(float percent) { 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); } int index = (int) (percent * mMaxVolume) + mVolume; if (index > mMaxVolume) index = mMaxVolume; else if (index < 0) index = 0; // 變更聲音 mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0); // 變更進(jìn)度條 ViewGroup.LayoutParams lp = mOperationPercent.getLayoutParams(); lp.width = findViewById(R.id.operation_full).getLayoutParams().width * index / mMaxVolume; mOperationPercent.setLayoutParams(lp); } /** * 滑動改變亮度 * * @param percent */ private void onBrightnessSlide(float percent) { 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.LayoutParams lpa = 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.LayoutParams lp = mOperationPercent.getLayoutParams(); lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * lpa.screenBrightness); mOperationPercent.setLayoutParams(lp); } @Override public void onConfigurationChanged(Configuration newConfig) { if (mVideoView != null) mVideoView.setVideoLayout(mLayout, 0); super.onConfigurationChanged(newConfig); } }
3.3 代碼說明
3.3.1 縮放功能
該功能SDK已經(jīng)提供好了接口,直接使用即可。
3.3.2 音量和亮度控制實現(xiàn)
根據(jù)layout可以看得出,利用FrameLayout的特點(后面視圖會覆蓋前面視圖),通過控制后一個視圖的寬度來達(dá)到進(jìn)度條的效果。
3.3.3 自動隱藏
可用Handle來實現(xiàn)自定延時隱藏的功能,比較實用。
3.3.4 手勢
手勢方面大家可用多查查GestureDetector方面的資料,雙擊、縮放手勢都可以實現(xiàn)。
四、代碼下載
請移步#Taocode(SVN):(沒有賬戶的請注冊一個賬戶即可。)
項目地址:http://code.taobao.org/p/oplayer
五、Vitamio相關(guān)信息
5.1 近期將發(fā)布新的SDK版本
5.1.1 將直接內(nèi)置各平臺解碼器,無需外下載!
5.1.2 將支持自定義進(jìn)度控制條等。
六、相關(guān)文章
6.1 Android 播放電影時滑動屏幕調(diào)整屏幕亮度
6.2 android MediaPlayer API
結(jié)束
本系列文章承諾每周至少出一篇,以幫助需要的朋友盡快將Vitamio融合入自己或公司的項目中。
以上就是對Android Vitamio 資料的整理,后續(xù)繼續(xù)補充。
- Android 使用Vitamio打造自己的萬能播放器(10)—— 本地播放 (縮略圖、視頻信息、視頻掃描服務(wù))
- Android 使用Vitamio打造自己的萬能播放器(9)—— 在線播放 (在線電視)
- Android 使用Vitamio打造自己的萬能播放器(8)——細(xì)節(jié)優(yōu)化
- Android 使用Vitamio打造自己的萬能播放器(7)——在線播放(下載視頻)
- Android 使用Vitamio打造自己的萬能播放器(6)——在線播放(播放列表)
- Android 使用Vitamio打造自己的萬能播放器(5)——在線播放(播放優(yōu)酷視頻)
- Android 使用Vitamio打造自己的萬能播放器(4)——本地播放(快捷搜索、數(shù)據(jù)存儲)
- Android 使用Vitamio打造自己的萬能播放器(3)——本地播放(主界面、播放列表)
- Android 使用Vitamio打造自己的萬能播放器(1)——準(zhǔn)備
- Android使用vitamio插件實現(xiàn)視頻播放器
相關(guān)文章
Android 控件(button)對齊方法實現(xiàn)詳解
horizontal是讓所有的子元素按水平方向從左到右排列,vertical是讓所有的子元素按豎直方向從上到下排列,下面為大家介紹下控件(button)的對齊方法2013-06-06Android實現(xiàn)手機(jī)震動抖動效果的方法
今天小編就為大家分享一篇關(guān)于Android實現(xiàn)手機(jī)震動抖動效果的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03Android仿QQ在狀態(tài)欄顯示登錄狀態(tài)效果
這篇文章主要介紹了Android仿QQ在狀態(tài)欄顯示登錄狀態(tài)效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12android Setting中隱藏項實現(xiàn)原理與代碼
我們都知道做程序員有時會惡搞,就像android中,程序員在setting中就隱藏這樣一項,接下來將詳細(xì)介紹,感興趣的朋友可以了解下哦2013-01-01Android 編輯頭像功能簡單實現(xiàn)實例(圖片選取,裁剪)
這篇文章主要介紹了Android 編輯頭像功能簡單實現(xiàn)實例(圖片選取,裁剪),非常具有實用價值,需要的朋友可以參考下2017-06-06深入理解TextView實現(xiàn)Rich Text--在同一個TextView設(shè)置不同字體風(fēng)格
本篇文章是對Android中在同一個TextView中設(shè)置不同的字體風(fēng)格進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Android開發(fā)RecyclerView單獨刷新使用技巧
本篇文章主要是分享下RecyclerView中子item如何單獨刷新以及子item的某一部分內(nèi)容如何實現(xiàn)單獨刷新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09