Android自定義視訊播放器(三)
一、引言
在上文中,我們通過自定義控制面板的佈局,來實現自定義的播放控制,下面來對裡面的各個元件進行事件繫結。
@Override public void onClick(View v) { if ( v == btnVoice ) { //聲音按鈕,處理聲音 isMute = !isMute; updataVoice(currentVoice, isMute); } else if ( v == btnSwichPlayer ) { // Handle clicks for btnSwichPlayer } else if ( v == btnExit ) { // Handle clicks for btnExit } else if ( v == btnVideoPre ) { // Handle clicks for btnVideoPre } else if ( v == btnVideoStartPause ) { //播放和暫停按鈕 startAndPause(); } else if ( v == btnVideoNext ) { // Handle clicks for btnVideoNext } else if ( v == btnVideoSiwchScreen ) { // Handle clicks for btnVideoSiwchScreen } }
二、播放按鈕和播放進度條SeekBar事件繫結
1、播放/暫停按鈕事件
//播放和暫停視訊 private void startAndPause() { if (videoView.isPlaying()) { //視訊在播放-設定暫停 videoView.pause(); //按鈕狀態設定播放 btnVideoStartPause.setBackgroundResource(R.drawable.btn_video_start_selector); } else { //視訊播放 videoView.start(); //按鈕狀態設定暫停 btnVideoStartPause.setBackgroundResource(R.drawable.btn_video_pause_selector); } }
2、播放視訊進度條事件
(1)為VideoView設定的監聽
//設定視訊準備好了的監聽
videoView.setOnPreparedListener(new MyPreparedListener());
//設定視訊播放出錯的監聽
videoView.setOnErrorListener(new MyErrorListener());
//設定視訊播放完成的監聽
videoView.setOnCompletionListener(new MyCompletionListener());
(2)當視訊準備好了,在該監聽器中,為SeekBar的總長賦值,並且傳送handler
private class MyPreparedListener implements MediaPlayer.OnPreparedListener {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
//視訊準備好了,進行播放
mediaPlayer.start();
//視訊的總時長,並關聯SeekBar的總長度
int duration = videoView.getDuration();
//設定SeekBar進度的總長
seekbarVideo.setMax(duration);
//設定視訊的總時間
tvDuration.setText(utils.stringForTime(duration));
//發訊息
handler.sendEmptyMessage(PROGRESS);
}
}
(3)處理handler傳送的訊息
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case PROGRESS:
//1.得到當前的視訊播放程序
int currentPosition = videoView.getCurrentPosition();//0
//2.SeekBar.setProgress(當前進度);
seekbarVideo.setProgress(currentPosition);
//3.更新文字播放進度
tvCurrentTime.setText(utils.stringForTime(currentPosition));
//此處需要設定系統時間,下面介紹
tvSystemTime.setText(getSysteTime());
//4.每秒更新一次
handler.removeMessages(PROGRESS);
handler.sendEmptyMessageDelayed(PROGRESS, 1000);
break;
}
}
};
3、播放視訊進度條SeekBar拖拽事件
(1)為SeekBar設定監聽
//設定視訊播放SeeKbar狀態變化的監聽
seekbarVideo.setOnSeekBarChangeListener(new VideoOnSeekBarChangeListener());
(2)監聽器實現
class VideoOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
/**
* 當手指滑動的時候,會引起SeekBar進度變化,會回撥這個方法
* @param seekBar
* @param progress
* @param fromUser 如果是使用者引起的true,不是使用者引起的false
*/
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
videoview.seekTo(progress);
}
}
/**
* 當手指觸碰的時候回撥這個方法
* @param seekBar
*/
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
/**
* 當手指離開的時候回撥這個方法
* @param seekBar
*/
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
4、音量進度條SeekBar的監聽
(1)、在OnCreate()方法中,初始化AudioManager,並將SeekBar與最大音量相關聯
//得到音量
am = (AudioManager) getSystemService(AUDIO_SERVICE);
currentVoice = am.getStreamVolume(AudioManager.STREAM_MUSIC);
maxVoice = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
//最大音量和SeekBar關聯
seekbarVoice.setMax(maxVoice);
//設定當前進度-當前音量
seekbarVoice.setProgress(currentVoice);
(2)、為音量SeekBar設定監聽
//為音量SeekBar設定監聽
seekbarVoice.setOnSeekBarChangeListener(new VoiceOnSeekBarChangeListener());
(3)、監聽器
class VoiceOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
//該引數同上述SeekBar
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
if (progress > 0) {
isMute = false;
} else {
isMute = true;
}
updataVoice(progress, isMute);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
/**
* 設定音量的大小
* @param progress
*/
private void updataVoice(int progress, boolean isMute) {
if (isMute) {
am.setStreamVolume(AudioManager.STREAM_MUSIC, 0, 0);
seekbarVoice.setProgress(0);
} else {
am.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);
seekbarVoice.setProgress(progress);
currentVoice = progress;
}
}
(4)、將音量與實體按鍵相關聯
/**
* 監聽物理健,實現聲音的調節大小
*
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
currentVoice--;
updataVoice(currentVoice, false);
return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
currentVoice++;
updataVoice(currentVoice, false);
return true;
}
return super.onKeyDown(keyCode, event);
}
5、效果圖,見圖一
三、註冊監聽手機電量的廣播接收器和獲取系統時間
1、註冊監聽手機電量的廣播接收器
(1)在onCreate()生命週期方法內,註冊監聽電量的廣播接收器
//此處為全域性變數,因為要解除繫結
receiver = new MyReceiver();
IntentFilter intentFiler = new IntentFilter();
//當電量變化的時候發這個廣播
intentFiler.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(receiver, intentFiler);
(2)、定義廣播接收器
class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra("level", 0);//0~100;
//不同的值,設定不同的圖片
if (level <= 0) {
ivBattery.setImageResource(R.drawable.ic_battery_0);
} else if (level <= 10) {
ivBattery.setImageResource(R.drawable.ic_battery_10);
} else if (level <= 20) {
ivBattery.setImageResource(R.drawable.ic_battery_20);
} else if (level <= 40) {
ivBattery.setImageResource(R.drawable.ic_battery_40);
} else if (level <= 60) {
ivBattery.setImageResource(R.drawable.ic_battery_60);
} else if (level <= 80) {
ivBattery.setImageResource(R.drawable.ic_battery_80);
} else if (level <= 100) {
ivBattery.setImageResource(R.drawable.ic_battery_100);
} else {
ivBattery.setImageResource(R.drawable.ic_battery_100);
}
}
}
3、需要在onDestroy()方法內部,解除廣播接收器
@Override
protected void onDestroy() {
//釋放資源的時候,先釋放子類,在釋放父類
if (receiver != null) {
unregisterReceiver(receiver);
receiver = null;
}
super.onDestroy();
}
2、獲取系統的時間
(1)、得到系統時間
public String getSysteTime() {
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
return format.format(new Date());
}
(2)、,在handler中,設定系統時間
//設定系統時間(上面註釋掉)
tvSystemTime.setText(getSysteTime());
3、見圖二
四、效果
1、圖一
2、圖二
五、補充
1、手指上下滑動螢幕,來調節音量的高低
步驟:
(1)、獲取螢幕的高和寬:
screenHeight; //螢幕的高
screenWidth; //螢幕的寬
(2)、計算滑動的上下距離;
//往下滑動
float distanceY = startY - endY < 0;
//往上滑動
float distanceY = startY - endY > 0;
(3)、利用公式,計算改變的聲音;
//公式:滑動螢幕的距離: 總距離 = 改變聲音:音量最大值
改變聲音 = (滑動螢幕的距離 :總距離)* 音量最大值
(4)、得到最終聲音;
最終聲音 = 原來的聲音 + 改變聲音;
2、在事件中,得到需要的變數值
(1)、onTouchEvent事件方法裡,在按下(down)的時候得到:
startY //開始位置
totalDis //螢幕的總距離
cVol //當前音量
(2)、onTouchEvent事件方法裡,在移動(move)的時候得到:
float endY = envent.getY(); //得到結束位置
float distanceY = endY - startY; //得到計算距離
改變聲音 = (滑動螢幕的距離 :總距離)* 音量最大值 //得到改變的音量
最終聲音 = cVol + 改變聲音;
updataVoice(); //設定音量
3、具體程式碼
//得到螢幕的寬和高方式
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
screenWidth = displayMetrics.widthPixels;
screenHeight = displayMetrics.heightPixels;
private float startY;
private float totalDis; //螢幕的高(總距離)
private int cVol; //一觸碰螢幕時的當前音量
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN://手指按下
//1.按下記錄值
startY = event.getY();
cVol = am.getStreamVolume(AudioManager.STREAM_MUSIC);
totalDis= Math.min(screenHeight, screenWidth);
break;
case MotionEvent.ACTION_MOVE://手指移動
float endY = event.getY();
float distanceY = startY - endY;
//改變聲音 = (滑動螢幕的距離: 總距離)*音量最大值
float delta = (distanceY / totalDis) * maxVoice;
//最終聲音 = 原來的 + 改變聲音;
int voice = (int) Math.min(Math.max(cVol + delta, 0), maxVoice);
if (delta != 0) {
isMute = false;
updataVoice(voice, isMute);
}
break;
case MotionEvent.ACTION_UP://手指離開
break;
}
return super.onTouchEvent(event);
}
相關推薦
Android自定義視訊播放器(三)
一、引言 在上文中,我們通過自定義控制面板的佈局,來實現自定義的播放控制,下面來對裡面的各個元件進行事件繫結。 @Override public void onClick(View v) { if ( v == btnVoice ) {
Android自定義視訊播放器(六)
一、引言 現在已經差不多完成了一個自定義的視訊播放器,還有一個讓視訊全屏播放的按鈕事件沒有繫結,下面會介紹。此外還要一個非常重要的功能就是,已經寫好了自定義的播放器,那麼就應該能被其他應用調起,來播放視訊,下面來完善這兩個功能。 二、全屏按鈕事件
Android自定義視訊播放器(一)
一、引言 我們在開發Android多媒體應用時,有兩種方式來播放多媒體資源。第一種是使用隱式的Intent,來使用系統或者手機已經安裝的第三方播放器應用來播放音視訊,第二種是使用Android自帶的、我們自定義的播放器來播放,這種主要是採用Android提供的
Android自定義視訊播放器(二)
一、引言 上一篇在對VideoView使用時,加上了這樣一行程式碼: videoView.setMediaController(new MediaController(this)); 這行程式碼為VideoView加上了控制面板,可以操作視訊播放的快
Android自定義視訊播放器(網路/本地)
最近因公司專案要求需要寫一個播放器,自帶的又不太好用,也不太好看。自能自定義啦。查看了很多資料,都沒有完善的,還好得以為前輩的指點得以完成,感謝Yang。本篇裡面我有可能有些地方寫得不好(都附上了註釋)。希望各路大神指點,虛心受教。 先來個圖(原始碼在後面附上) 視訊列表裡面
MFC 基於VLC的視訊播放器(三)---介面設計以及對話方塊接受檔案的拖拽
北京時間23點11分 2018年12月20日 前面已經完成了vlc的環境的搭建,下面便開始真正的程式設計。 前面的介面是這樣的: 理想的介面應該是這樣的: 所以新增按鈕、進度條和播放列表控制元件,並且修改好ID。 介面設計完成,執行,還是隻是一個空殼,因為沒加任
Android使用Vitamio框架自定義視訊播放器
做過Android視訊播放器的碼農們都或多或少知道自帶的VideoView用著沒有那麼順心。需要處理很多東西。於是就各種度娘、Google。終於皇天不負苦心人。找到了一個卻又不大符合。無奈,想自己動手寫吧!又浪
android surfaceView+mediaPlayer 自定義視訊播放器
Android 視訊播放一般分為兩種(其實3種,還一種是調Android自帶播放器): 1.使用Android自帶View VideoView ,其中一些功能,已經都給實現好了(此view一般不滿足自己的需求,比如:介面啊,控制啊,以及可能還有手勢控制音量,手勢控制亮度等等
jquery實現--自定義視訊播放器
html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="wid
Android 自定義音樂播放器實現
Android自定義音樂播放器一:首先介紹用了哪些Android的知識點:1 MediaPlayer工具來播放音樂2 Handle。因為存在定時任務(歌詞切換,動畫,歌詞進度條變換等)需要由Handle來處理Ui相關內容3 動態許可權申請(該應用程式讀取本地歌曲,並且設定音質
HTML5+CSS3+JQuery打造自定義視訊播放器
簡介 HTML5的<video>標籤已經被目前大多數主流瀏覽器所支援,包括還未正式釋出的IE9也宣告將支援<video>標籤,利用瀏覽器原生特性嵌入視訊有很多好處,所以很多開發者想盡快用上,但是真正使用前還有些問題要考慮,尤其是 Opera/Fir
Android視訊編輯器(三)給本地視訊加水印和美顏濾鏡
從截圖可以看到,其實我們這裡還存在一些小問題 第一個就是預覽的時候水印圖片較小,而二次編碼完成的水印變大了。原因是,我們的水印是一個bitmap圖片,他的寬高的畫素點是固定的,預覽時候介面的寬高是全屏的,也就是說是手機螢幕的寬高,而編碼時候,視訊的寬高是原視訊的寬高,我們並沒有對原視訊大
一步步自定義視訊播放器——使用SurfaceView播放視訊
Surface Surface與SurfaceView這篇文章對Surface和SurfaceView做了很詳細的解釋。 簡單的說Surface對應了一塊螢幕緩衝區,每個window對應一個Surface,任何View都要畫在Surface的Canvas上。
AVPlayer自定義視訊播放器
我的avplayer播放器,能橫屏,豎屏,適應螢幕,上程式碼 1.我把我的那個最主要的類的.m的主要的程式碼附上 @implementation LDZMoviePlayerController - (void)viewDidLoad { [super vie
Exoplayer+Exomedia打造自定義視訊播放器
寫在前面的話 對App視訊播放模組進行擴充套件,需要自定義播放器的樣式、監聽視訊播放過程中各種事件(播放開始、暫停、重新播放、結束、拖拽進度條、橫豎屏切換等)、橫豎屏切換、手動控制播放進度等。 自定義功能性、擴充套件性較好的視訊播放模組。初次技術選型時利用gith
【朝花夕拾】Android自定義View篇之(四)自定義View的三種實現方式及自定義屬性詳解
前言 儘管Android系統提供了不少控制元件,但是有很多酷炫效果仍然是系統原生控制元件無法實現的。好在Android允許自定義控制元件,來彌補原生控制元件的不足。但是在很多初學者看來,自定義View似乎很難掌握。其中有很大一部分原因是我們平時看到的自定
【朝花夕拾】Android自定義View篇之(五)Android事件分發機制(上)三個重要方法的處理邏輯
前言 在自定義View中,經常需要處理Android事件分發的問題,尤其在有多個輸入裝置(如遙控、滑鼠、遊戲手柄等)時,事件處理問題尤為突出。Android事件分發機制,一直以來都是一個讓眾多開發者困擾的難點,至少筆者在工作的前幾年中,沒有特意研究它之前
基於QT的網路音樂播放器(三)
得到AlbumID和FileHash後訪問http://www.kugou.com/yy/index.php?r=play/getdata&hash= &album_id= &_=1497972864535 其中hash後面跟的就是前面
MFC 基於VLC的視訊播放器(二)---配置VLC庫
北京時間 23點18分 2018年12月19日 因為我之前是完成了一次,現在重新來寫一遍,所以更新會比較慢。 整理好步驟如下: 1、新建一個MFC專案,基於對話方塊 基於對話方塊,下一步,下一步,完成。 建立完成。 2、先初步修改介面。
MFC 基於VLC的視訊播放器(一)---簡介
大家好,我是一名大四學生,今年的科研訓練題目是做一個播放器,從以前就很想試著做一下,大概花了四五天寫完程式碼,這幾天來寫總結。 先看一下執行的效果: 主介面: 執行介面: 涉及到的知識:1、MFC上播放gif動畫 2、MFC的