diff --git a/app/src/main/assets/lottie/follow.json b/app/src/main/assets/lottie/follow.json new file mode 100644 index 0000000000..f95a60687f --- /dev/null +++ b/app/src/main/assets/lottie/follow.json @@ -0,0 +1 @@ +{"v":"5.6.4","fr":25,"ip":0,"op":40,"w":66,"h":66,"nm":"合成 3","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"路径","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[40]},{"i":{"x":[0.23],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15,"s":[40]},{"t":18,"s":[100]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.683],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[-60]},{"t":16,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.278,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[28.25,36.75,0],"to":[0.792,-0.625,0],"ti":[-0.792,0.625,0]},{"t":18,"s":[33,33,0]}],"ix":2},"a":{"a":0,"k":[-0.67,2.403,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.544,0.544,0.333],"y":[0,0,0]},"t":26,"s":[100,100,100]},{"t":39,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[1.997,-3.994],[1.997,3.995],[-1.993,3.995]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176000237,0.588235020638,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":-315,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.126],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[75]},{"t":18,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":100,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"路径 2备份","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.544],"y":[1]},"o":{"x":[0.515],"y":[0]},"t":5,"s":[100]},{"t":10,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.606],"y":[0]},"t":3,"s":[0]},{"t":10,"s":[30]}],"ix":10},"p":{"a":0,"k":[33,33.018,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.994,0],[3.996,0]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径 2备份","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"路径 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.112],"y":[1]},"o":{"x":[0.621],"y":[0]},"t":5,"s":[100]},{"t":10,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.595],"y":[0]},"t":3,"s":[0]},{"t":10,"s":[120]}],"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2},"a":{"a":0,"k":[0,0.003,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,3.996],[0,-3.994]],"c":false},"ix":2},"nm":"路径 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.5,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"路径 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.01],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":3,"s":[0]},{"t":10,"s":[50]}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"修剪路径 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"椭圆形","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.256],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[60]},{"t":18,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[100,100,100]},{"t":18,"s":[120,120,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141176000237,0.588235020638,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"椭圆形 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[33,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":3,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[120,120,100]},{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":28,"s":[120,120,100]},{"t":37,"s":[0,0,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[17,17]},{"t":3,"s":[18,18]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[300,300],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":40,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt index eef5295a1a..045fd0e52c 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/DetailPlayerView.kt @@ -1,5 +1,7 @@ package com.gh.gamecenter.video.detail +import android.animation.AnimatorSet +import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.app.Activity import android.content.Context @@ -69,6 +71,7 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib private var mLastClickTime = 0L private var mLottieLike: LottieAnimationView? = null private var mHandler: Handler? = null + private var weChatAnimate: AnimatorSet? = null init { mHandler = Handler(Handler.Callback { @@ -168,7 +171,7 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib } else { likeIv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_video_detail_like)) } - attentionIv.goneIf(videoEntity.me.isFollower || videoEntity.user.id == UserManager.getInstance().userId) + attentionIv.goneIf(videoEntity.user.id == UserManager.getInstance().userId || videoEntity.me.isFollower) attentionIv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_video_detail_follow)) if (!likeContainer.hasOnClickListeners()) RxView.clicks(likeContainer) @@ -245,10 +248,17 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib ToastUtils.showToast("网络错误") return@setOnClickListener } - mViewModel?.follow(videoEntity) - recordMta("关注用户") - uploadVideoStreamingPlaying("关注用户") - MtaHelper.onEvent("视频详情", "关注用户", mCombinedTitleAndId) + attentionLottie.visibility = View.VISIBLE + attentionIv.visibility = View.GONE + attentionLottie.setAnimation("lottie/follow.json") + attentionLottie.playAnimation() + attentionLottie.doOnAnimationEnd { + attentionLottie.visibility = View.GONE + mViewModel?.follow(videoEntity) + recordMta("关注用户") + uploadVideoStreamingPlaying("关注用户") + MtaHelper.onEvent("视频详情", "关注用户", mCombinedTitleAndId) + } } } } @@ -402,6 +412,27 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib } } + private fun playWechatAnimation() { + if (weChatAnimate == null) { + shareIv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_video_detail_share_wechat)) + val scaleXAnimation = ObjectAnimator.ofFloat(shareIv, "scaleX", 1f, 0.9f, 1f) + scaleXAnimation.repeatCount = -1 + val scaleYAnimation = ObjectAnimator.ofFloat(shareIv, "scaleY", 1f, 0.9f, 1f) + scaleYAnimation.repeatCount = -1 + + weChatAnimate = AnimatorSet() + weChatAnimate?.play(scaleXAnimation)?.with(scaleYAnimation) + weChatAnimate?.duration = 1500 + weChatAnimate?.start() + } + } + + fun removeWechatAnimation() { + weChatAnimate?.end() + weChatAnimate = null + shareIv.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_video_detail_share)) + } + override fun createNetWorkState() { if (mNetInfoModule == null) { mNetInfoModule = NetInfoModule(mContext.applicationContext, NetInfoModule.NetChangeListener { state -> @@ -707,6 +738,7 @@ class DetailPlayerView @JvmOverloads constructor(context: Context, attrs: Attrib repeatPlayCount++ seekOnStart = 0 startPlayLogic() + playWechatAnimation() } override fun onCompletion() { diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt index e4d97e59db..7522b4a1cc 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailActivity.kt @@ -12,10 +12,6 @@ import java.util.* // 由于兼容性问题,本游戏详情页不应该被低于 Android 4.4 的设备打开 class VideoDetailActivity : BaseActivity() { var uuid = UUID.randomUUID() -// var isPauseVideo = true//跳转页面时是否需要暂停视频 - var mLastTime = 0L - var mIsDown = false - private val mIntervalTime = 500 override fun getLayoutId(): Int { return R.layout.activity_video_detail @@ -35,22 +31,6 @@ class VideoDetailActivity : BaseActivity() { supportFragmentManager.beginTransaction().replace(R.id.layout_activity_content, containerFragment).commitNowAllowingStateLoss() } - //限制视频滑动频率 - override fun dispatchTouchEvent(ev: MotionEvent): Boolean { - if (ev.action == MotionEvent.ACTION_DOWN) { - mIsDown = true - } else if (ev.action == MotionEvent.ACTION_MOVE) { - if (mIsDown && System.currentTimeMillis() - mLastTime < mIntervalTime) { - return true - } - } else if (ev.action == MotionEvent.ACTION_UP) { - mLastTime = System.currentTimeMillis() - mIsDown = false - } - return super.dispatchTouchEvent(ev) - } - - override fun onDestroy() { CustomManager.releaseAllVideos("detail_$uuid") mBaseHandler.postDelayed({ diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt index 73445d5665..1d08d21ce3 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt @@ -220,6 +220,7 @@ class VideoDetailContainerFragment : BaseLazyFragment(), OnBackPressedListener { mViewModel.entranceDetail, video.id, mViewModel.uuid, 0.0, 0, 0, "play") } val detailPlayerView = recyclerview.findViewHolderForAdapterPosition(position)?.itemView as? DetailPlayerView + detailPlayerView?.removeWechatAnimation() detailPlayerView?.repeatPlayCount = 0 detailPlayerView?.unObserveVolume(requireActivity() as AppCompatActivity) detailPlayerView?.removeLikeAnimation() diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_detail_share_wechat.png b/app/src/main/res/drawable-xxhdpi/ic_video_detail_share_wechat.png new file mode 100644 index 0000000000..072bcbbf52 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_video_detail_share_wechat.png differ diff --git a/app/src/main/res/drawable/bg_video_detail_name.xml b/app/src/main/res/drawable/bg_video_detail_name.xml index f3f7db9557..ccfc39049f 100644 --- a/app/src/main/res/drawable/bg_video_detail_name.xml +++ b/app/src/main/res/drawable/bg_video_detail_name.xml @@ -1,6 +1,6 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_video.xml b/app/src/main/res/layout/fragment_home_video.xml index 8ddca1e219..85a2915c76 100644 --- a/app/src/main/res/layout/fragment_home_video.xml +++ b/app/src/main/res/layout/fragment_home_video.xml @@ -49,7 +49,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/mTabIndicator" - android:layout_marginTop="24dp"> + android:layout_marginTop="5dp"> + @@ -318,7 +326,7 @@ android:id="@+id/commentContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="14dp" + android:layout_marginTop="20dp" android:gravity="center" android:orientation="vertical"> @@ -343,11 +351,12 @@ android:id="@+id/shareContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="14dp" + android:layout_marginTop="20dp" android:gravity="center" android:orientation="vertical">