編輯:關於Android編程
android視頻播放主要是兩種方式1、系統封裝好的videoplayer,有前進、後退、暫停/播放、拉動最基本的功能,夠一般使用,操作辦法也很簡單,如果需要自定義程度高就需要用到第二種方法:SurfaceView+mediaplayer,顯示通過surfaceView,使mediaplayer和surfaceview綁定
SurfaceView+mediaplayer,主要操作辦法:1、監聽surfaceview回調函數,等待surfaceview初始化完畢
surface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); surface.getHolder().addCallback(new Callback() {// surface初始化的回調 // 發生改變 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } // 創建完成 public void surfaceCreated(SurfaceHolder holder) { Log.e("media", "surfaceView創建完成!"); preMediaplayer(); } // 銷毀 public void surfaceDestroyed(SurfaceHolder holder) { } });2、初始化完畢後就可以對mediaplayer進行操作了,需要了解mediaplayer的生命周期圖
if (SinoAppliacation.mediaPlayer == null) { SinoAppliacation.mediaPlayer = new MediaPlayer(); } try { SinoAppliacation.mediaPlayer.reset(); SinoAppliacation.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); SinoAppliacation.mediaPlayer.setDisplay(surface.getHolder()); SinoAppliacation.mediaPlayer.setDataSource(url); SinoAppliacation.mediaPlayer.setLooping(true); SinoAppliacation.mediaPlayer.prepareAsync();幾項最基本的初始化操作,包括設置聲音、和surfaceview綁定、設置播放地址、循環播放,異步准備。
在做幾項最基本的監聽:
SinoAppliacation.mediaPlayer.setOnInfoListener(new OnInfoListener() {// 等待緩沖監聽 @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what) { case MediaPlayer.MEDIA_INFO_BUFFERING_START: loading.setVisibility(View.VISIBLE); break; case MediaPlayer.MEDIA_INFO_BUFFERING_END: // 緩存完成,繼續播放 loading.setVisibility(View.INVISIBLE); break; } return true; } }); SinoAppliacation.mediaPlayer.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { mCurrentState = STATE_ERROR; Log.e("mediaplay", "error"); Toast.makeText(BaseVideoPlayActivity.this, "親,視頻出錯了!", 0).show(); return false; } }); SinoAppliacation.mediaPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { initTimeAndBar(); SinoAppliacation.mediaPlayer.start(); } }); } catch (Exception e) { Log.e("media", e + ""); }
基本就這些
做的過程中遇到的問題及解決辦法:
1、加載時的監聽。有兩種方式,一個是加載的進度占總進度的比例,一般可以用兩個進度條去做加載狀態,可以 通過mediaplayer的mediaPlayer.setOnBufferingUpdateListener來監聽。如果是拖動還未加載出當前視頻,可以通過setOnInfoListener來監聽。
2、豎屏切換橫屏。有很多人提出這樣的需求,但是貌似沒有很好的解決辦法,android貌似也沒有ios那種無縫的一個頁面切換的辦法。我這裡的解決辦法是在application裡存放一個靜態的mediaplayer
public static MediaPlayer mediaPlayer;//視頻播放靜態類豎屏和橫屏是兩個activity,但是切換時只是對靜態mediaplayer執行pause,在獲取到當前播放位置傳遞給第二個activity,在執行start播放
3、在切換頁面時,直接給靜態的mediaplayer調用start方法時會報錯,或者從頭播放。原因有兩個,一、沒判斷surfaceview是否加載成功,重新進入activity也需要對surfaceview的准備狀態進行監聽,當執行surfaceCreated創建完成時才可繼續操作。二、沒有把surfaceview和mediaplayer重新綁定,必須執行setDisplay(surface.getHolder());後再去執行start才能正常播放!
Dagger2是一款最初由Square公司研發,後交由Google進行維護管理的依賴注入(Dependency Injection DI)框架。我想之所以其越來越受歡迎,
相關閱讀:ReactiveCocoa代碼實踐之-更多思考ReactiveCocoa代碼實踐之-RAC網絡請求重構這一節是自己對網絡層的一些重構,本節是自己一些代碼小實
Android 實現會旋轉的餅狀統計圖實例代碼最近在做一個項目,由於有需要統計的需要,於是就做成了下面餅狀統計圖。 下圖是效果圖: 大致思路是: 關於的介紹這裡不做詳細介
之前項目需求裡有一個需求是要根據每周的天氣溫度去繪制一個趨勢圖,這個圖不基於XY坐標,就是一個單純的趨勢圖,百度後看了一些博客,大體上有了一些思路,下面是整個趨勢圖的效果