轉載請標明出處:
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);
}
第一個知識點,如何實現小屏、全屏無縫切換