转载请标明出处:
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);
}
第一个知识点,如何实现小屏、全屏无缝切换