提交 33c4b382 编写于 作者: S shuyu

add small video

上级 bebf0c9d
package com.example.gsyvideoplayer;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.transition.Explode;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import com.example.gsyvideoplayer.adapter.ListNormalAdapter;
import com.example.gsyvideoplayer.adapter.ListVideoAdapter;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.GSYVideoPlayer;
import com.shuyu.gsyvideoplayer.utils.CommonUtil;
import com.shuyu.gsyvideoplayer.utils.ListVideoUtil;
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer;
......@@ -48,6 +53,38 @@ public class ListVideo2Activity extends AppCompatActivity {
listVideoAdapter.setRootView(activityListVideo);
videoList.setAdapter(listVideoAdapter);
videoList.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastVisibleItem = firstVisibleItem + visibleItemCount;
//大于0说明有播放,//对应的播放列表TAG
if (listVideoUtil.getPlayPosition() >= 0 && listVideoUtil.getPlayTAG().equals(ListVideoAdapter.TAG)) {
//当前播放的位置
int position = listVideoUtil.getPlayPosition();
//不可视的是时候
if ((position < firstVisibleItem || position > lastVisibleItem)) {
//如果是小窗口就不需要处理
if (!listVideoUtil.isSmall()) {
//小窗口
int size = CommonUtil.dip2px(ListVideo2Activity.this, 150);
listVideoUtil.showSmallVideo(new Point(size, size), false, true);
}
} else {
if (listVideoUtil.isSmall()) {
listVideoUtil.smallVideoToNormal();
}
}
}
}
});
}
......
......@@ -34,7 +34,7 @@ import static com.example.gsyvideoplayer.utils.CommonUtil.setViewHeight;
public class ListVideoAdapter extends BaseAdapter {
private String TAG = "TT";
public final static String TAG = "TT2";
private List<VideoModel> list = new ArrayList<>();
private LayoutInflater inflater = null;
......
......@@ -45,13 +45,13 @@ public abstract class GSYVideoPlayer extends GSYBaseVideoPlayer implements View.
public static final String TAG = "GSYVideoPlayer";
protected static final int CURRENT_STATE_NORMAL = 0; //正常
protected static final int CURRENT_STATE_PREPAREING = 1; //准备中
protected static final int CURRENT_STATE_PLAYING = 2; //播放中
protected static final int CURRENT_STATE_PLAYING_BUFFERING_START = 3; //开始缓冲
protected static final int CURRENT_STATE_PAUSE = 5; //暂停
protected static final int CURRENT_STATE_AUTO_COMPLETE = 6; //自动播放结束
protected static final int CURRENT_STATE_ERROR = 7; //错误状态
public static final int CURRENT_STATE_NORMAL = 0; //正常
public static final int CURRENT_STATE_PREPAREING = 1; //准备中
public static final int CURRENT_STATE_PLAYING = 2; //播放中
public static final int CURRENT_STATE_PLAYING_BUFFERING_START = 3; //开始缓冲
public static final int CURRENT_STATE_PAUSE = 5; //暂停
public static final int CURRENT_STATE_AUTO_COMPLETE = 6; //自动播放结束
public static final int CURRENT_STATE_ERROR = 7; //错误状态
public static final int FULL_SCREEN_NORMAL_DELAY = 2000;
......@@ -424,6 +424,18 @@ public abstract class GSYVideoPlayer extends GSYBaseVideoPlayer implements View.
mTextureViewContainer.addView(mTextureView, layoutParams);
}
/**
* 小窗口
**/
@Override
protected void setSmallVideoTextureView(View.OnTouchListener onTouchListener) {
mTextureView.setOnTouchListener(onTouchListener);
mProgressBar.setOnTouchListener(null);
mFullscreenButton.setOnTouchListener(null);
mTextureView.setOnClickListener(null);
}
/**
* 设置界面选择
*/
......@@ -612,6 +624,10 @@ public abstract class GSYVideoPlayer extends GSYBaseVideoPlayer implements View.
}
protected void onClickUiToggle() {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
......
package com.shuyu.gsyvideoplayer;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import com.shuyu.gsyvideoplayer.video.GSYBaseVideoPlayer;
public class SmallVideoTouch implements View.OnTouchListener {
private int mDownX, mDownY;
private int mMarginLeft, mMarginTop;
private int _xDelta, _yDelta;
private GSYBaseVideoPlayer mGsyBaseVideoPlayer;
public SmallVideoTouch(GSYBaseVideoPlayer gsyBaseVideoPlayer, int marginLeft, int marginTop) {
super();
mMarginLeft = marginLeft;
mMarginTop = marginTop;
mGsyBaseVideoPlayer = gsyBaseVideoPlayer;
}
@Override
public boolean onTouch(View view, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mDownX = X;
mDownY = Y;
FrameLayout.LayoutParams lParams = (FrameLayout.LayoutParams) mGsyBaseVideoPlayer
.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
break;
case MotionEvent.ACTION_UP:
if (Math.abs(mDownY - Y) < 5 && Math.abs(mDownX - X) < 5) {
return false;
} else {
return true;
}
case MotionEvent.ACTION_MOVE:
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) mGsyBaseVideoPlayer
.getLayoutParams();
layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
if (layoutParams.leftMargin >= mMarginLeft) {
layoutParams.leftMargin = mMarginLeft;
}
if (layoutParams.topMargin >= mMarginTop) {
layoutParams.topMargin = mMarginTop;
}
if (layoutParams.leftMargin <= 0) {
layoutParams.leftMargin = 0;
}
if (layoutParams.topMargin <= 0) {
layoutParams.topMargin = 0;
}
mGsyBaseVideoPlayer.setLayoutParams(layoutParams);
}
return false;
}
}
\ No newline at end of file
......@@ -8,6 +8,7 @@ import android.net.NetworkInfo;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.internal.view.ContextThemeWrapper;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.WindowManager;
......@@ -138,4 +139,49 @@ public class CommonUtil {
}
return null;
}
/**
* dip转为PX
*/
public static int dip2px(Context context, float dipValue) {
float fontScale = context.getResources().getDisplayMetrics().density;
return (int) (dipValue * fontScale + 0.5f);
}
/**
* 根据手机的分辨率从 px 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 获取屏幕的宽度px
*
* @param context 上下文
* @return 屏幕宽px
*/
public static int getScreenWidth(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();// 创建了一张白纸
windowManager.getDefaultDisplay().getMetrics(outMetrics);// 给白纸设置宽高
return outMetrics.widthPixels;
}
/**
* 获取屏幕的高度px
*
* @param context 上下文
* @return 屏幕高px
*/
public static int getScreenHeight(Context context) {
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();// 创建了一张白纸
windowManager.getDefaultDisplay().getMetrics(outMetrics);// 给白纸设置宽高
return outMetrics.heightPixels;
}
}
......@@ -3,6 +3,7 @@ package com.shuyu.gsyvideoplayer.utils;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Build;
import android.os.Handler;
import android.transition.TransitionManager;
......@@ -32,16 +33,17 @@ public class ListVideoUtil {
private ViewGroup.LayoutParams listParams;
private OrientationUtils orientationUtils;
private Context context;
private int playPosition = -1; // 播放的位置
private boolean isFull; //当前是否全屏
private boolean isSmall; //当前是否小屏
private boolean autoRotation = true;//是否自动旋转
private boolean fullLandFrist = true; //是否全屏就马上横屏
private boolean hideStatusBar; //是否隐藏有状态bar
private boolean hideActionBar; //是否隐藏有状态ActionBar
protected int[] listItemRect;//当前item框的屏幕位置
protected int[] listItemSize;//当前item的大小
private int[] listItemRect;//当前item框的屏幕位置
private int[] listItemSize;//当前item的大小
private Handler handler = new Handler();
......@@ -50,6 +52,8 @@ public class ListVideoUtil {
public ListVideoUtil(Context context) {
gsyVideoPlayer = new StandardGSYVideoPlayer(context);
this.context = context;
int smallVideoWidth = CommonUtil.getScreenWidth(context) / 2 - CommonUtil.dip2px(context, 20);
int smallVideoHeight = smallVideoWidth * 3 / 4;
}
/**
......@@ -339,6 +343,30 @@ public class ListVideoUtil {
}
/**
* 显示小屏幕效果
*
* @param size 小视频的大小
* @param actionBar 是否有actionBar
* @param statusBar 是否有状态栏
*/
public void showSmallVideo(Point size, final boolean actionBar, final boolean statusBar) {
if (gsyVideoPlayer.getCurrentState() == GSYVideoPlayer.CURRENT_STATE_PLAYING) {
gsyVideoPlayer.showSmallVideo(size, actionBar, statusBar);
isSmall = true;
}
}
/**
* 恢复小屏幕效果
*/
public void smallVideoToNormal() {
isSmall = false;
gsyVideoPlayer.hideSmallVideo();
}
/**
* 设置全屏显示的viewGroup
*
......@@ -420,4 +448,16 @@ public class ListVideoUtil {
public void setShowFullAnimation(boolean showFullAnimation) {
this.showFullAnimation = showFullAnimation;
}
public int getPlayPosition() {
return playPosition;
}
public String getPlayTAG() {
return TAG;
}
public boolean isSmall() {
return isSmall;
}
}
......@@ -3,6 +3,7 @@ package com.shuyu.gsyvideoplayer.video;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.os.Build;
import android.os.Handler;
import android.transition.TransitionManager;
......@@ -18,6 +19,7 @@ import android.widget.ImageView;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.GSYVideoPlayer;
import com.shuyu.gsyvideoplayer.R;
import com.shuyu.gsyvideoplayer.SmallVideoTouch;
import com.shuyu.gsyvideoplayer.listener.GSYMediaPlayerListener;
import com.shuyu.gsyvideoplayer.utils.CommonUtil;
import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
......@@ -36,7 +38,9 @@ import static com.shuyu.gsyvideoplayer.utils.CommonUtil.showSupportActionBar;
public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMediaPlayerListener {
protected static final int FULLSCREEN_ID = 83797;
protected static final int FULLSCREEN_ID = 85597;
public static final int SMALL_ID = 84778;
protected static long CLICK_QUIT_FULLSCREEN_TIME = 0;
......@@ -91,8 +95,8 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
/**
* 移除没用的
*/
private void removeVideo(ViewGroup vp) {
View old = vp.findViewById(FULLSCREEN_ID);
private void removeVideo(ViewGroup vp, int id) {
View old = vp.findViewById(id);
if (old != null) {
if (old.getParent() != null) {
ViewGroup viewGroup = (ViewGroup) old.getParent();
......@@ -173,7 +177,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
final ViewGroup vp = getViewGroup();
removeVideo(vp);
removeVideo(vp, FULLSCREEN_ID);
if (mTextureViewContainer.getChildCount() > 0) {
mTextureViewContainer.removeAllViews();
......@@ -293,6 +297,81 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
}
}
/**
* 显示小窗口
*/
public void showSmallVideo(Point size, final boolean actionBar, final boolean statusBar) {
final ViewGroup vp = getViewGroup();
removeVideo(vp, SMALL_ID);
if (mTextureViewContainer.getChildCount() > 0) {
mTextureViewContainer.removeAllViews();
}
try {
Constructor<GSYBaseVideoPlayer> constructor = (Constructor<GSYBaseVideoPlayer>) GSYBaseVideoPlayer.this.getClass().getConstructor(Context.class);
GSYBaseVideoPlayer gsyVideoPlayer = constructor.newInstance(getContext());
gsyVideoPlayer.setId(SMALL_ID);
//int size = CommonUtil.
FrameLayout.LayoutParams lpParent = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
FrameLayout frameLayout = new FrameLayout(mContext);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(size.x, size.y);
int marginLeft = CommonUtil.getScreenWidth(mContext) - size.x;
int marginTop = CommonUtil.getScreenHeight(mContext) - size.y;
if (actionBar) {
marginTop = marginTop - getActionBarHeight((Activity) mContext);
}
if (statusBar) {
marginTop = marginTop - getStatusBarHeight(mContext);
}
lp.setMargins(marginLeft, marginTop, 0, 0);
frameLayout.addView(gsyVideoPlayer, lp);
vp.addView(frameLayout, lpParent);
gsyVideoPlayer.setUp(mUrl, mCache, mObjects);
gsyVideoPlayer.setStateAndUi(mCurrentState);
gsyVideoPlayer.addTextureView();
gsyVideoPlayer.onClickUiToggle();
gsyVideoPlayer.setSmallVideoTextureView(new SmallVideoTouch(gsyVideoPlayer, marginLeft, marginTop));
GSYVideoManager.instance().setLastListener(this);
GSYVideoManager.instance().setListener(gsyVideoPlayer);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 隐藏小窗口
*/
public void hideSmallVideo() {
final ViewGroup vp = getViewGroup();
GSYVideoPlayer gsyVideoPlayer = (GSYVideoPlayer) vp.findViewById(SMALL_ID);
removeVideo(vp, SMALL_ID);
mCurrentState = GSYVideoManager.instance().getLastState();
if (gsyVideoPlayer != null) {
mCurrentState = gsyVideoPlayer.getCurrentState();
}
GSYVideoManager.instance().setListener(GSYVideoManager.instance().lastListener());
GSYVideoManager.instance().setLastListener(null);
setStateAndUi(mCurrentState);
addTextureView();
CLICK_QUIT_FULLSCREEN_TIME = System.currentTimeMillis();
}
/**
* 设置播放URL
......@@ -328,6 +407,13 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia
*/
protected abstract void addTextureView();
/**
* 小窗口
**/
protected abstract void setSmallVideoTextureView(View.OnTouchListener onTouchListener);
protected abstract void onClickUiToggle();
/**
* 获取全屏按键
*/
......
......@@ -256,7 +256,8 @@ public class StandardGSYVideoPlayer extends GSYVideoPlayer {
startDismissControlViewTimer();
}
private void onClickUiToggle() {
@Override
protected void onClickUiToggle() {
if (mCurrentState == CURRENT_STATE_PREPAREING) {
if (mBottomContainer.getVisibility() == View.VISIBLE) {
changeUiToPrepareingClear();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册