diff --git a/README.md b/README.md index db781a1fc39a923a8187a56e067f60da08839a14..b18a60432554da227b81639d7f3c4948ea9d27fb 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,13 @@ com.shuyu gsyVideoPlayer - 1.1.5 + 1.1.6 pom ``` ``` -compile 'com.shuyu:gsyVideoPlayer:1.1.5' +compile 'com.shuyu:gsyVideoPlayer:1.1.6' ``` ## 效果,录屏下的屏幕旋转和实际有些出入 @@ -42,6 +42,18 @@ compile 'com.shuyu:gsyVideoPlayer:1.1.5' *

3、详情模式

+ +## 1.1.6 优化了第二种列表ListVideoUtil的全屏效果,和列表一的全屏效果一致,两种全屏效果增加是否打开关闭接口。 + +``` +/** + * 全屏动画 + * + * @param showFullAnimation 是否使用全屏动画效果 + */ +public void setShowFullAnimation(boolean showFullAnimation) +``` + ## 1.1.5 优化了一些UI,增加了一些有趣的动画,比如播放按键。 * 推荐这个动画效果ENViews diff --git a/gradle.properties b/gradle.properties index 391eeee8f1cd4f390f272975d6c6b34e4963338d..b04eb4e917488b58e1f38bbaace8181bbb591cb5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ org.gradle.jvmargs=-Xmx1536m BINTRAY_USER= BINTRAY_KEY= PROJ_GROUP=com.shuyu -PROJ_VERSION=1.1.5 +PROJ_VERSION=1.1.6 PROJ_NAME=gsyVideo PROJ_WEBSITEURL=hhttps://github.com/CarGuo/GSYVideoPlayer PROJ_ISSUETRACKERURL= diff --git a/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/GSYVideoManager.java b/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/GSYVideoManager.java index 9b1ec0bab82b960424de3deadbcd004186d13729..e78779fa2c868a03ad7cf0a0afe646bb1e734ae4 100644 --- a/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/GSYVideoManager.java +++ b/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/GSYVideoManager.java @@ -15,7 +15,6 @@ import com.shuyu.gsyvideoplayer.listener.GSYMediaPlayerListener; import com.shuyu.gsyvideoplayer.model.GSYModel; import java.lang.ref.WeakReference; -import java.lang.reflect.Method; import java.util.Map; import tv.danmaku.ijk.media.player.IMediaPlayer; diff --git a/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/utils/ListVideoUtil.java b/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/utils/ListVideoUtil.java index 178616b881f4d484b16c0f1b7305ed45cd766037..933adf00c7d2e7345681162bf00ad0b7d7612377 100644 --- a/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/utils/ListVideoUtil.java +++ b/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/utils/ListVideoUtil.java @@ -6,14 +6,19 @@ import android.graphics.Color; import android.os.Build; import android.os.Handler; import android.transition.TransitionManager; +import android.view.Gravity; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; +import android.widget.FrameLayout; import com.shuyu.gsyvideoplayer.GSYVideoPlayer; import com.shuyu.gsyvideoplayer.R; +import com.shuyu.gsyvideoplayer.video.GSYBaseVideoPlayer; import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer; +import static com.shuyu.gsyvideoplayer.utils.CommonUtil.getActionBarHeight; +import static com.shuyu.gsyvideoplayer.utils.CommonUtil.getStatusBarHeight; + /** * Created by shuyu on 2016/11/12. */ @@ -24,6 +29,7 @@ public class ListVideoUtil { private StandardGSYVideoPlayer gsyVideoPlayer; private ViewGroup fullViewContainer; private ViewGroup listParent;//记录列表中item的父布局 + private ViewGroup.LayoutParams listParams; private OrientationUtils orientationUtils; private Context context; private int playPosition = -1; // 播放的位置 @@ -33,6 +39,14 @@ public class ListVideoUtil { private boolean hideStatusBar; //是否隐藏有状态bar private boolean hideActionBar; //是否隐藏有状态ActionBar + protected int[] listItemRect;//当前item框的屏幕位置 + + protected int[] listItemSize;//当前item的大小 + + private Handler handler = new Handler(); + + private boolean showFullAnimation = true; + public ListVideoUtil(Context context) { gsyVideoPlayer = new StandardGSYVideoPlayer(context); this.context = context; @@ -111,7 +125,7 @@ public class ListVideoUtil { if (!isFull) { resolveToFull(); } else { - resolveToNormal(); + resolveMaterialToNormal(gsyVideoPlayer); } } @@ -122,12 +136,11 @@ public class ListVideoUtil { CommonUtil.hideSupportActionBar(context, hideActionBar, hideStatusBar); isFull = true; ViewGroup viewGroup = (ViewGroup) gsyVideoPlayer.getParent(); + listParams = gsyVideoPlayer.getLayoutParams(); if (viewGroup != null) { listParent = viewGroup; viewGroup.removeView(gsyVideoPlayer); } - fullViewContainer.setBackgroundColor(Color.BLACK); - fullViewContainer.addView(gsyVideoPlayer); gsyVideoPlayer.setIfCurrentIsFullscreen(true); gsyVideoPlayer.getFullscreenButton().setImageResource(R.drawable.video_shrink); gsyVideoPlayer.getBackButton().setVisibility(View.VISIBLE); @@ -137,36 +150,88 @@ public class ListVideoUtil { gsyVideoPlayer.getBackButton().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - resolveToNormal(); + resolveMaterialToNormal(gsyVideoPlayer); } }); - if (isFullLandFrist()) { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - if (orientationUtils.getIsLand() != 1) { - orientationUtils.resolveByClick(); - } - } - }, 50); + if (showFullAnimation && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (fullViewContainer instanceof FrameLayout) { + //目前只做了frameLoayout的判断 + resolveMaterialAnimation(); + } else { + resolveFullAdd(); + } + + } else { + resolveFullAdd(); } } + /** + * 添加到全屏父布局里 + */ + private void resolveFullAdd() { + fullViewContainer.setBackgroundColor(Color.BLACK); + fullViewContainer.addView(gsyVideoPlayer); + resolveChangeFirstLogic(50); + } + + /** + * 如果是5.0的动画开始位置 + */ + private void resolveMaterialAnimation() { + listItemRect = new int[2]; + listItemSize = new int[2]; + saveLocationStatus(context, hideStatusBar, hideActionBar); + FrameLayout.LayoutParams lpParent = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + FrameLayout frameLayout = new FrameLayout(context); + frameLayout.setBackgroundColor(Color.BLACK); + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(listItemSize[0], listItemSize[1]); + lp.setMargins(listItemRect[0], listItemRect[1], 0, 0); + frameLayout.addView(gsyVideoPlayer, lp); + fullViewContainer.addView(frameLayout, lpParent); + handler.postDelayed(new Runnable() { + @Override + public void run() { + //开始动画 + TransitionManager.beginDelayedTransition(fullViewContainer); + resolveMaterialFullVideoShow(gsyVideoPlayer); + resolveChangeFirstLogic(600); + } + }, 300); + } + + /** + * 如果是5.0的,要从原位置过度到全屏位置 + */ + private void resolveMaterialFullVideoShow(GSYBaseVideoPlayer gsyVideoPlayer) { + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) gsyVideoPlayer.getLayoutParams(); + lp.setMargins(0, 0, 0, 0); + lp.height = ViewGroup.LayoutParams.MATCH_PARENT; + lp.width = ViewGroup.LayoutParams.MATCH_PARENT; + lp.gravity = Gravity.CENTER; + gsyVideoPlayer.setLayoutParams(lp); + gsyVideoPlayer.setIfCurrentIsFullscreen(true); + } + + /** * 处理正常逻辑 */ private void resolveToNormal() { CommonUtil.showSupportActionBar(context, hideActionBar, hideStatusBar); int delay = orientationUtils.backToProtVideo(); - new Handler().postDelayed(new Runnable() { + handler.postDelayed(new Runnable() { @Override public void run() { isFull = false; fullViewContainer.removeAllViews(); + if (gsyVideoPlayer.getParent() != null) { + ((ViewGroup) gsyVideoPlayer.getParent()).removeView(gsyVideoPlayer); + } orientationUtils.setEnable(false); gsyVideoPlayer.setIfCurrentIsFullscreen(false); fullViewContainer.setBackgroundColor(Color.TRANSPARENT); - listParent.addView(gsyVideoPlayer); + listParent.addView(gsyVideoPlayer, listParams); gsyVideoPlayer.getFullscreenButton().setImageResource(R.drawable.video_enlarge); gsyVideoPlayer.getBackButton().setVisibility(View.GONE); } @@ -174,6 +239,71 @@ public class ListVideoUtil { } + /** + * 动画回到正常效果 + */ + private void resolveMaterialToNormal(final GSYVideoPlayer gsyVideoPlayer) { + if (showFullAnimation && fullViewContainer instanceof FrameLayout && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + int delay = orientationUtils.backToProtVideo(); + handler.postDelayed(new Runnable() { + @Override + public void run() { + TransitionManager.beginDelayedTransition(fullViewContainer); + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) gsyVideoPlayer.getLayoutParams(); + lp.setMargins(listItemRect[0], listItemRect[1], 0, 0); + lp.width = listItemSize[0]; + lp.height = listItemSize[1]; + //注意配置回来,不然动画效果会不对 + lp.gravity = Gravity.NO_GRAVITY; + gsyVideoPlayer.setLayoutParams(lp); + handler.postDelayed(new Runnable() { + @Override + public void run() { + resolveToNormal(); + } + }, 400); + } + }, delay); + } else { + resolveToNormal(); + } + } + + + /** + * 是否全屏一开始马上自动横屏 + */ + private void resolveChangeFirstLogic(int time) { + if (isFullLandFrist()) { + handler.postDelayed(new Runnable() { + @Override + public void run() { + if (orientationUtils.getIsLand() != 1) { + orientationUtils.resolveByClick(); + } + } + }, time); + } + } + + /** + * 保存大小和状态 + */ + private void saveLocationStatus(Context context, boolean statusBar, boolean actionBar) { + listParent.getLocationOnScreen(listItemRect); + int statusBarH = getStatusBarHeight(context); + int actionBerH = getActionBarHeight((Activity) context); + if (statusBar) { + listItemRect[1] = listItemRect[1] - statusBarH; + } + if (actionBar) { + listItemRect[1] = listItemRect[1] - actionBerH; + } + listItemSize[0] = listParent.getWidth(); + listItemSize[1] = listParent.getHeight(); + } + + /** * 是否当前播放 */ @@ -192,7 +322,7 @@ public class ListVideoUtil { boolean isFull = false; if (fullViewContainer.getChildCount() > 0) { isFull = true; - resolveToNormal(); + resolveMaterialToNormal(gsyVideoPlayer); } return isFull; } @@ -276,4 +406,18 @@ public class ListVideoUtil { public void setHideActionBar(boolean hideActionBar) { this.hideActionBar = hideActionBar; } + + + public boolean isShowFullAnimation() { + return showFullAnimation; + } + + /** + * 全屏动画 + * + * @param showFullAnimation 是否使用全屏动画效果 + */ + public void setShowFullAnimation(boolean showFullAnimation) { + this.showFullAnimation = showFullAnimation; + } } diff --git a/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/video/GSYBaseVideoPlayer.java b/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/video/GSYBaseVideoPlayer.java index 46cf3b9a2f4ce17a4d117fd704806dc01803aae5..49972bfb7291bf6ebde23b676c7021cef18f5528 100644 --- a/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/video/GSYBaseVideoPlayer.java +++ b/gsyVideoPlayer/src/main/java/com/shuyu/gsyvideoplayer/video/GSYBaseVideoPlayer.java @@ -46,6 +46,8 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia protected boolean mCache = false;//是否播边边缓冲 + private boolean mShowFullAnimation = true;//是否使用全屏动画效果 + protected int[] mListItemRect;//当前item框的屏幕位置 protected int[] mListItemSize;//当前item的大小 @@ -68,6 +70,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia private Handler mHandler = new Handler(); + public GSYBaseVideoPlayer(Context context) { super(context); } @@ -190,7 +193,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia FrameLayout frameLayout = new FrameLayout(context); frameLayout.setBackgroundColor(Color.BLACK); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (mShowFullAnimation && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(getWidth(), getHeight()); lp.setMargins(mListItemRect[0], mListItemRect[1], 0, 0); frameLayout.addView(gsyVideoPlayer, lp); @@ -264,7 +267,7 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia final GSYVideoPlayer gsyVideoPlayer; if (oldF != null) { gsyVideoPlayer = (GSYVideoPlayer) oldF; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (mShowFullAnimation && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { TransitionManager.beginDelayedTransition(vp); FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) gsyVideoPlayer.getLayoutParams(); @@ -355,4 +358,18 @@ public abstract class GSYBaseVideoPlayer extends FrameLayout implements GSYMedia public void setRotateViewAuto(boolean rotateViewAuto) { this.mRotateViewAuto = rotateViewAuto; } + + + public boolean ismShowFullAnimation() { + return mShowFullAnimation; + } + + /** + * 全屏动画 + * + * @param showFullAnimation 是否使用全屏动画效果 + */ + public void setShowFullAnimation(boolean showFullAnimation) { + this.mShowFullAnimation = showFullAnimation; + } }