1. 程式人生 > >Vitamio自定義控制器MediaController樣式

Vitamio自定義控制器MediaController樣式

先看一下效果圖


比自帶控制器多出上面選單,並將視訊名稱改到上面顯示

先是佈局檔案 mymdiacontroller

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="34dp"
            android:background="#77000000">

            <ImageButton
                android:id="@+id/mediacontroller_top_back"
                android:layout_width="50dp"
                android:layout_height="match_parent"
                android:layout_alignParentStart="true"
                android:background="@null"
                android:src="@drawable/left_white_arrow"/>

            <TextView
                android:id="@+id/mediacontroller_file_name"
                style="@style/MediaController_Text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:layout_marginLeft="5dp"
                android:ellipsize="marquee"
                android:singleLine="true"
                android:text="file name"/>

            <TextView
                android:id="@+id/mediacontroller_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="5dp"
                android:text="17:22"
                android:textColor="#ffffff"
                android:textSize="15sp"/>
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/rl_med"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:background="#77000000">

            <ImageButton
                android:id="@+id/mediacontroller_play_pause"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="5dp"
                android:background="@drawable/mediacontroller_button"
                android:contentDescription="@string/mediacontroller_play_pause"
                android:src="@drawable/mediacontroller_pause"/>

            <TextView
                android:id="@+id/mediacontroller_time_current"
                style="@style/MediaController_Text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="5dp"
                android:layout_toRightOf="@id/mediacontroller_play_pause"
                android:text="33:33:33"
                />

            <TextView
                android:id="@+id/mediacontroller_time_total"
                style="@style/MediaController_Text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="5dp"
                android:text="33:33:33"/>

            <SeekBar
                android:id="@+id/mediacontroller_seekbar"
                style="@style/MediaController_SeekBar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@id/mediacontroller_time_total"
                android:layout_toRightOf="@id/mediacontroller_time_current"
                android:focusable="true"
                android:max="1000"/>

        </RelativeLayout>
    </RelativeLayout>
</LinearLayout>
然後是控制器程式碼MyMediaController.java
public class MyMediaController extends MediaController {

    private GestureDetector mGestureDetector;
    private ImageButton img_back;
    private TextView textViewTime;
    private VideoView videoView;
    private Activity activity;
    private Context context;
    private int controllerWidth = 0;//設定mediaController高度為了使橫屏時top顯示在螢幕頂端

    //返回監聽
    private View.OnClickListener backListener = new View.OnClickListener() {
        public void onClick(View v) {
            if(activity != null){
                activity.finish();
            }
        }
    };
    //videoview 用於對視訊進行控制的等,activity為了退出
    public MyMediaController(Context context, VideoView videoView , Activity activity) {
        super(context);
        this.context = context;
        this.videoView = videoView;
        this.activity = activity;
        WindowManager wm = (WindowManager) context
                .getSystemService(Context.WINDOW_SERVICE);
        controllerWidth = wm.getDefaultDisplay().getWidth();
        mGestureDetector = new GestureDetector(context, new MyGestureListener());
    }

    @Override
    protected View makeControllerView() {
        //加入佈局檔案,mymediacontroller佈局名稱
        View v = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(getResources().getIdentifier("mymediacontroller", "layout", getContext().getPackageName()), this);
        v.setMinimumHeight(controllerWidth);
        img_back = (ImageButton) v.findViewById(getResources().getIdentifier("mediacontroller_top_back", "id", context.getPackageName()));
        img_back.setOnClickListener(backListener);
        textViewTime = (TextView)v.findViewById(getResources().getIdentifier("mediacontroller_time", "id", context.getPackageName()));
        return v;

    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
//        System.out.println("MYApp-MyMediaController-dispatchKeyEvent");
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (mGestureDetector.onTouchEvent(event)) return true;
        // 處理手勢結束
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_UP:
                break;
        }
        return super.onTouchEvent(event);
    }

    private class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return false;
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            //當收拾結束,並且是單擊結束時,控制器隱藏/顯示
            toggleMediaControlsVisiblity();
            return super.onSingleTapConfirmed(e);
        }

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            return super.onScroll(e1, e2, distanceX, distanceY);
        }
        //雙擊暫停或開始
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            playOrPause();
            return true;
        }
    }
    //設定時間
    public void setTime(String time){
        if (textViewTime != null)
            textViewTime.setText(time);
    }
    //隱藏/顯示
    private void toggleMediaControlsVisiblity(){
        if (isShowing()) {
            hide();
        } else {
            show();
        }
    }
    //播放與暫停
    private void playOrPause(){
        if (videoView != null)
            if (videoView.isPlaying()) {
                videoView.pause();
            } else {
                videoView.start();
            }
    }
}

上面程式碼直接複製就可以使用了.

Activity中使用示例

public class CompanyVideoActivity extends BaseActivity implements Runnable{
    //返回佈局id
    @Override
    protected int getLayoutId() {
        return R.layout.activity_company_video;
    }

    private VideoView mVideoView;
    private MyMediaController myMediaController;

    private static final int TIME = 0;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case TIME:
                    myMediaController.setTime(msg.obj.toString());
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //設定為全屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        //設定視訊解碼監聽
        if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this))
            return;

        mVideoView = (VideoView) findViewById(R.id.vv_videoplay);
        //設定播放地址
        mVideoView.setVideoURI(Uri.parse("http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/D046015255134077DDB3ACA0D7E68D45.flv"));
        //建立控制器
        myMediaController = new MyMediaController(this,mVideoView,this);
        //設定控制器
        mVideoView.setMediaController(myMediaController);
        //設定高畫質
        mVideoView.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH);
        //設定顯示時長
        myMediaController.show(5000);
        mVideoView.requestFocus();

        new Thread(this).start();

    }
    @Override
    public void onConfigurationChanged(Configuration newConfig) {

        if (mVideoView != null){
            mVideoView.setVideoLayout(VideoView.VIDEO_LAYOUT_SCALE, 0);
        }
        super.onConfigurationChanged(newConfig);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (true) {
            //時間讀取執行緒
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            String str = sdf.format(new Date());
            Message msg = new Message();
            msg.obj = str;
            msg.what = TIME;
            mHandler.sendMessage(msg);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }

    //隱藏狀態列
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }
}

清單檔案設定
<activity android:name=".activity.CompanyVideoActivity"
            android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
            android:launchMode="singleTop"/>


最後放一些常用方法:

public void onFinishInflate() 
//從XML載入完所有子檢視後呼叫。初始化控制檢視(呼叫initControllerView方法,設定事件、繫結控制元件和設定預設值)。

public void setAnchorView(View view) 
//設定MediaController繫結到一個檢視上。例如可以是一個VideoView物件,或者是你的activity的主檢視。 
//引數 view 可見時繫結的檢視

public void setMediaPlayer(MediaPlayerControl player) 
//設定媒體播放器。並更新播放/暫停按鈕狀態。

public void setInstantSeeking(boolean seekWhenDragging) 
//設定使用者拖拽SeekBar時畫面是否跟著變化。(VPlayer預設完成操作後再更新畫面)

public void show() 
//顯示MediaController。預設顯示3秒後自動隱藏。

public void show(int timeout) 
//顯示MediaController。在timeout毫秒後自動隱藏。 
//引數 timeout 超時時間,單位毫秒。為0時控制條的hide()將被呼叫。

public void setFileName(String name) 
//設定視訊檔名稱。

public void setInfoView(OutlineTextView v) 
//設定儲存MediaController的操作資訊。例如進度改變時更新v。
public void setAnimationStyle(int animationStyle) //更改MediaController的動畫風格。 //如果MediaController正在顯示,呼叫此方法將在下一次顯示時生效。 //引數 animationStyle 在MediaController顯示或隱藏時使用的動畫風格。設定-1為預設風格,0沒有動畫,或設定一個明確的動畫資源。public boolean isShowing() //獲取MediaController是否已經顯示。public void hide() //隱藏MediaController。public void setOnShownListener(OnShownListener l) //註冊一個回撥函式,在MediaController顯示後被呼叫。public void setOnHiddenListener(OnHiddenListener l) //註冊一個回撥函式,在MediaController隱藏後被呼叫。public boolean onTouchEvent(MotionEvent event) //呼叫show()並返回true。public boolean onTrackballEvent(MotionEvent ev) //呼叫show()並返回false。public void setEnabled(boolean enabled) //設定MediaController的可用狀態。包括進度條和播放/暫停按鈕。 protected View makeControllerView() //建立控制播放的佈局檢視。子類可重寫此方法建立自定義檢視。