android開發之音視頻(二)

轉載請標明出處:
http://blog.csdn.net/AnalyzeSystem/article/details/79311530
本文出自Analyzesystem的博客

我且把視頻開發大致分爲視頻顯示控件和音視頻控制控件、彈窗控件

  • MediaPlayer

  • MediaController

  • Popu


height="230" width="130" src="https://img-blog.csdn.net/20180211163401355?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQW5hbHl6ZVN5c3RlbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast">

播放器MediaPlayer可以理解爲一個容器,容納多種佈局,這裏佈局按照16:9的比例顯示畫面,擺在博主面前的第一個難題出現了,如何實現小屏和全屏的無縫切換?網上有諸多方案並不能令博主滿意,最後在幾經嘗試以及一位博友提示下想到了一個方案

修改MediaPlayer onMeasure函數,根據不同的模式動態requestLayout 動態調整控件寬高,同時回調函數通知隱藏狀態欄和標題欄(不一定是標題欄,所以回調函數自己控制)

Tip:
一定要注意修改manifest文件 android:configChanges="screenSize|keyboardHidden|orientation",這樣橫豎屏切換不會走生命週期,只會changed回調

下面是僞類代碼塊

package idea.analyzesystem.ijkplayer.widget;

import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;

import idea.analyzesystem.ijkplayer.interfaces.MediaPlayerListener;

/**
 * Created by idea on 2018/2/11.
 */
public class MediaPlayer extends FrameLayout implements View.OnClickListener{

    private final Point screenPoint;

    public static final int MODE_LANDSCAPE = 0;

    public static final int MODE_PORTRAITSCREEN = 1;

    private int mode = MODE_PORTRAITSCREEN;

    public int getMode() {
        return mode;
    }

    /**
     *  MODE_LANDSCAPE 、MODE_PORTRAITSCREEN
     * @param mode
     */
    public void setMode(int mode) {
        if(this.mode!=mode){
            this.mode = mode;
            switch (getMode()){
                case MODE_LANDSCAPE:
                    if(getScreenChangedListener()!=null){
                        getScreenChangedListener().onLandScape();
                    }
                    requestLayout();
                    break;

                case MODE_PORTRAITSCREEN:
                    if(getScreenChangedListener()!=null){
                        getScreenChangedListener().onPortailScreen();
                    }
                    requestLayout();
                    break;
            }
        }

    }

    public MediaPlayer(Context context) {
        this(context,null,0);
    }

    public MediaPlayer(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MediaPlayer(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        screenPoint = new Point();
        windowManager.getDefaultDisplay().getSize(screenPoint);

        setOnClickListener(this);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        switch (getMode()){
            case MODE_LANDSCAPE:
                setMeasuredDimension(screenPoint.y,screenPoint.x);
                break;

            case MODE_PORTRAITSCREEN:

                setMeasuredDimension(screenPoint.x,screenPoint.x/16*9);
                break;
        }
    }


    @Override
    public void onClick(View v) {
    }

    /************************************Listener*********************************/

    private MediaPlayerListener.ScreenChangedListener screenChangedListener;

    public MediaPlayerListener.ScreenChangedListener getScreenChangedListener() {
        return screenChangedListener;
    }

    public void setScreenChangedListener(MediaPlayerListener.ScreenChangedListener screenChangedListener) {
        this.screenChangedListener = screenChangedListener;
    }
}

播放界面僞代碼塊

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ideaMediaPlayer.setScreenChangedListener(this);
}

@Override
public void onLandScape() {
        titleView.setVisibility(View.GONE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}

@Override
public void onPortailScreen() {
        titleView.setVisibility(View.VISIBLE);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

第一個知識點,如何實現小屏、全屏無縫切換

發佈了104 篇原創文章 · 獲贊 99 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章