1. 程式人生 > >Android自定義視訊播放器(三)

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的