Commit 7ca10b3a authored by jyx's avatar jyx

添加倒计时

parent 30866098
...@@ -27,6 +27,15 @@ public class VedioBean implements Serializable { ...@@ -27,6 +27,15 @@ public class VedioBean implements Serializable {
private int recommendIndex;// 推荐视频第几集 private int recommendIndex;// 推荐视频第几集
private long seeUpdateTime;// 时间戳 private long seeUpdateTime;// 时间戳
private boolean checked;// 选中 private boolean checked;// 选中
private int tipMaxIndex;// 倒计时弹框
public int getTipMaxIndex() {
return tipMaxIndex;
}
public void setTipMaxIndex(int tipMaxIndex) {
this.tipMaxIndex = tipMaxIndex;
}
public boolean isChecked() { public boolean isChecked() {
return checked; return checked;
......
...@@ -14,7 +14,6 @@ import com.mints.wisdomclean.ui.activitys.* ...@@ -14,7 +14,6 @@ import com.mints.wisdomclean.ui.activitys.*
import com.mints.wisdomclean.ui.fragment.base.BaseFragment import com.mints.wisdomclean.ui.fragment.base.BaseFragment
import com.mints.wisdomclean.utils.SpanUtils import com.mints.wisdomclean.utils.SpanUtils
import com.mints.wisdomclean.utils.TimeRender import com.mints.wisdomclean.utils.TimeRender
import com.mints.wisdomclean.video.DPHolderManager
import kotlinx.android.synthetic.main.fragment_main_my.* import kotlinx.android.synthetic.main.fragment_main_my.*
/** /**
......
package com.mints.wisdomclean.ui.widgets
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.view.ViewConfiguration
import android.widget.FrameLayout
import androidx.viewpager2.widget.ViewPager2
import androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL
import kotlin.math.absoluteValue
import kotlin.math.sign
class NestedScrollableHost : FrameLayout {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
private var touchSlop = 0
private var initialX = 0f
private var initialY = 0f
//循环遍历找到viewPager2
private val parentViewPager: ViewPager2?
get() {
var v: View? = parent as? View
while (v != null && v !is ViewPager2) {
v = v.parent as? View
}
return v as? ViewPager2
}
//找到子RecyclerView
private val child: View? get() = if (childCount > 0) getChildAt(0) else null
init {
//最小滑动距离
touchSlop = ViewConfiguration.get(context).scaledTouchSlop
}
private fun canChildScroll(orientation: Int, delta: Float): Boolean {
val direction = -delta.sign.toInt()
return when (orientation) {
//判断子RecyclerView在水平方向是否可以滑动deltaX
0 -> child?.canScrollHorizontally(direction) ?: false
//判断子RecyclerView在竖直方向是否可以滑动deltaY
1 -> child?.canScrollVertically(direction) ?: false
else -> throw IllegalArgumentException()
}
}
override fun onInterceptTouchEvent(e: MotionEvent): Boolean {
handleInterceptTouchEvent(e)
return super.onInterceptTouchEvent(e)
}
private fun handleInterceptTouchEvent(e: MotionEvent) {
val orientation = parentViewPager?.orientation ?: return
//如果子RecyclerView在viewPager2的滑动方向上不能滑动直接返回
if (!canChildScroll(orientation, -1f) && !canChildScroll(orientation, 1f)) {
return
}
if (e.action == MotionEvent.ACTION_DOWN) {
initialX = e.x
initialY = e.y
//down事件直接强制禁止父view拦截事件,后续事件先交给子RecyclerView先判断是否能够消费
//如果这一块不强制禁止父view会导致后续事件可能直接没到子RecyclerView就被父view拦截了
//默认RecyclerView onTouchEvent返回true但是viewPager2会在onInterceptTouchEvent拦截住
parent.requestDisallowInterceptTouchEvent(true)
} else if (e.action == MotionEvent.ACTION_MOVE) {
//计算手指滑动距离
val dx = e.x - initialX
val dy = e.y - initialY
val isVpHorizontal = orientation == ORIENTATION_HORIZONTAL
val scaledDx = dx.absoluteValue * if (isVpHorizontal) .5f else 1f
val scaledDy = dy.absoluteValue * if (isVpHorizontal) 1f else .5f
//滑动距离超过最小滑动值
if (scaledDx > touchSlop || scaledDy > touchSlop) {
if (isVpHorizontal == (scaledDy > scaledDx)) {
//如果viewPager2是横向滑动但手势是竖直方向滑动,则允许所有父类拦截
parent.requestDisallowInterceptTouchEvent(false)
} else {
//手势滑动方向和viewPage2是同方向的,需要询问子RecyclerView是否在同方向能滑动
if (canChildScroll(orientation, if (isVpHorizontal) dx else dy)) {
//子RecyclerView能滑动直接禁止父view拦截事件
parent.requestDisallowInterceptTouchEvent(true)
} else {
//子RecyclerView不能滑动(划到第一个Item还往右滑或者划到最后面一个Item还往左划的时候)允许父view拦截
parent.requestDisallowInterceptTouchEvent(false)
}
}
}
}
}
}
package com.mints.wisdomclean.ui.widgets
import android.app.Activity
import android.app.Dialog
import android.content.Intent
import android.view.Gravity
import android.view.KeyEvent
import android.view.View
import android.view.WindowManager
import android.widget.TextView
import com.mints.wisdomclean.R
import com.mints.wisdomclean.ui.activitys.VipActivity
import com.mints.wisdomclean.ui.widgets.countdowntimer.CountDownTimerSupport
import com.mints.wisdomclean.ui.widgets.countdowntimer.OnCountDownTimerListener
class VipCountDialog(activity: Activity) : Dialog(activity, R.style.dialog) {
private val lp: WindowManager.LayoutParams
var timer: CountDownTimerSupport? = null
init {
setContentView(R.layout.dialog_vip_count)
// 设置window属性
lp = window!!.attributes
lp.gravity = Gravity.CENTER
lp.width = WindowManager.LayoutParams.MATCH_PARENT
lp.windowAnimations = R.style.DialogAnimFade
window!!.attributes = lp
// 设置外部不可关闭
setCancelable(false)
setCanceledOnTouchOutside(false)
setOnKeyListener { dialogInterface, i, keyEvent ->
i == KeyEvent.KEYCODE_BACK
}
val fm = findViewById<View>(R.id.fm)
val text_count = findViewById<TextView>(R.id.text_count)
timer = CountDownTimerSupport(3000L, 1000)
timer?.setOnCountDownTimerListener(object : OnCountDownTimerListener {
override fun onTick(millisUntilFinished: Long) {
text_count.text = (millisUntilFinished / 1000L).toString()
}
override fun onFinish() {
dismiss()
}
})
timer?.start()
fm.setOnClickListener {
activity.startActivity(Intent(activity, VipActivity::class.java))
dismiss()
}
}
override fun dismiss() {
super.dismiss()
this.mOnDialogDismiss?.onDialogDismiss()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
timer?.stop()
timer = null
}
private var mOnDialogDismiss: OnDialogDismiss? = null
fun setOnDialogDismiss(onDialogDismiss: OnDialogDismiss): Dialog {
this.mOnDialogDismiss = onDialogDismiss
return this
}
interface OnDialogDismiss {
fun onDialogDismiss()
}
}
\ No newline at end of file
...@@ -29,6 +29,7 @@ import com.mints.wisdomclean.ui.activitys.base.BaseActivity ...@@ -29,6 +29,7 @@ import com.mints.wisdomclean.ui.activitys.base.BaseActivity
import com.mints.wisdomclean.ui.adapter.VideoEpisodeAdapter import com.mints.wisdomclean.ui.adapter.VideoEpisodeAdapter
import com.mints.wisdomclean.ui.widgets.DialogListener import com.mints.wisdomclean.ui.widgets.DialogListener
import com.mints.wisdomclean.ui.widgets.VideoEpisodeDialog import com.mints.wisdomclean.ui.widgets.VideoEpisodeDialog
import com.mints.wisdomclean.ui.widgets.VipCountDialog
import com.mints.wisdomclean.utils.LogUtil import com.mints.wisdomclean.utils.LogUtil
import kotlinx.android.synthetic.main.drama_activity_api_detail.* import kotlinx.android.synthetic.main.drama_activity_api_detail.*
import org.json.JSONObject import org.json.JSONObject
...@@ -286,6 +287,8 @@ class DramaApiDetailActivity : BaseActivity(), VideoEpisodeAdapter.OnEpisodeClic ...@@ -286,6 +287,8 @@ class DramaApiDetailActivity : BaseActivity(), VideoEpisodeAdapter.OnEpisodeClic
mVedioBean!!.seeIndex = position + 1 mVedioBean!!.seeIndex = position + 1
LogUtil.d("AAAAA -> " + mVedioBean!!.seeIndex + " - " + position) LogUtil.d("AAAAA -> " + mVedioBean!!.seeIndex + " - " + position)
LocalVedioManager.commitVedio(mVedioBean!!) LocalVedioManager.commitVedio(mVedioBean!!)
showVipCountDialog(position)
} }
override fun onDPVideoPlay(map: MutableMap<String, Any>?) { override fun onDPVideoPlay(map: MutableMap<String, Any>?) {
...@@ -554,4 +557,15 @@ class DramaApiDetailActivity : BaseActivity(), VideoEpisodeAdapter.OnEpisodeClic ...@@ -554,4 +557,15 @@ class DramaApiDetailActivity : BaseActivity(), VideoEpisodeAdapter.OnEpisodeClic
} }
} }
private fun showVipCountDialog(position: Int) {
if (mVedioBean!!.tipMaxIndex == 0 || mVedioBean!!.tipMaxIndex - 1 < position) return
VipCountDialog(this)
.setOnDialogDismiss(object : VipCountDialog.OnDialogDismiss {
override fun onDialogDismiss() {
}
})
.show()
}
} }
\ No newline at end of file
...@@ -28,7 +28,7 @@ import com.mints.wisdomclean.ui.activitys.base.BaseActivity ...@@ -28,7 +28,7 @@ import com.mints.wisdomclean.ui.activitys.base.BaseActivity
import com.mints.wisdomclean.ui.adapter.VideoEpisodeAdapter import com.mints.wisdomclean.ui.adapter.VideoEpisodeAdapter
import com.mints.wisdomclean.ui.widgets.DialogListener import com.mints.wisdomclean.ui.widgets.DialogListener
import com.mints.wisdomclean.ui.widgets.VideoEpisodeDialog import com.mints.wisdomclean.ui.widgets.VideoEpisodeDialog
import com.mints.wisdomclean.utils.LogUtil import com.mints.wisdomclean.ui.widgets.VipCountDialog
import kotlinx.android.synthetic.main.activity_video.* import kotlinx.android.synthetic.main.activity_video.*
import java.util.HashMap import java.util.HashMap
...@@ -116,7 +116,8 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -116,7 +116,8 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView,
override fun onInitComplete() { override fun onInitComplete() {
dialog?.setCurrentIndex(mCurrentPosition) dialog?.setCurrentIndex(mCurrentPosition)
//初始化 自动播放 //初始化 自动播放
autoPlayVideo() // autoPlayVideo()
showVipCountDialog(mCurrentPosition)
} }
override fun onPageRelease(isNext: Boolean, position: Int) { override fun onPageRelease(isNext: Boolean, position: Int) {
...@@ -137,7 +138,9 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -137,7 +138,9 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView,
// loadData() // loadData()
} }
mCurrentPosition = position mCurrentPosition = position
autoPlayVideo() // autoPlayVideo()
showVipCountDialog(mCurrentPosition)
dialog?.setCurrentIndex(mCurrentPosition) dialog?.setCurrentIndex(mCurrentPosition)
} }
...@@ -179,8 +182,6 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -179,8 +182,6 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView,
// VIdeoindex -> seeIndex // VIdeoindex -> seeIndex
mVedioBean!!.seeIndex = videos[mCurrentPosition].vedioIndex mVedioBean!!.seeIndex = videos[mCurrentPosition].vedioIndex
LogUtil.d("AAAAA -> " + mVedioBean!!.seeIndex + " - " + mCurrentPosition + " " + videos[mCurrentPosition].vedioIndex)
LocalVedioManager.commitVedio(mVedioBean!!) LocalVedioManager.commitVedio(mVedioBean!!)
//播放开始,进行倒计时 //播放开始,进行倒计时
} }
...@@ -276,7 +277,8 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -276,7 +277,8 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView,
mCurrentPosition = position mCurrentPosition = position
recy.scrollToPosition(position) recy.scrollToPosition(position)
Handler(Looper.getMainLooper()).postDelayed({ Handler(Looper.getMainLooper()).postDelayed({
autoPlayVideo() showVipCountDialog(mCurrentPosition)
// autoPlayVideo()
}, 300) }, 300)
} }
...@@ -359,5 +361,18 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView, ...@@ -359,5 +361,18 @@ class VideoActivity : BaseActivity(), View.OnClickListener, VideoView,
} }
} }
private fun showVipCountDialog(position: Int) {
if (mVedioBean!!.tipMaxIndex == 0 || mVedioBean!!.tipMaxIndex - 1 < position) {
autoPlayVideo()
return
}
VipCountDialog(this)
.setOnDialogDismiss(object : VipCountDialog.OnDialogDismiss {
override fun onDialogDismiss() {
autoPlayVideo()
}
})
.show()
}
} }
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/fm"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_margin="50dp"
android:background="@drawable/shape_banner_write">
<ImageView
android:layout_width="match_parent"
android:layout_height="200dp"
android:scaleType="centerCrop"
android:src="@mipmap/bg_vip_count" />
<TextView
android:id="@+id/text_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="20dp"
android:background="@mipmap/bg_vip_count_circle"
android:gravity="center"
android:text="3"
android:textColor="@color/tv_message_recente_money"
android:textSize="30sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="30dp"
android:text="一分钱签约会员解锁全部剧集"
android:textColor="@color/black" />
</FrameLayout>
</RelativeLayout>
...@@ -11,6 +11,11 @@ ...@@ -11,6 +11,11 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginBottom="50dp" /> android:layout_marginBottom="50dp" />
<View
android:id="@+id/view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
......
...@@ -4,10 +4,15 @@ ...@@ -4,10 +4,15 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black"> android:background="@color/black">
<androidx.recyclerview.widget.RecyclerView <com.mints.wisdomclean.ui.widgets.NestedScrollableHost
android:id="@+id/recy"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:layout_marginTop="30dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp" />
</com.mints.wisdomclean.ui.widgets.NestedScrollableHost>
</FrameLayout> </FrameLayout>
\ No newline at end of file
<resources> <resources>
<style name="SwipeBackLayout"> <style name="SwipeBackLayout">
<item name="edge_size">0dp</item> <item name="edge_size">0dp</item>
</style> </style>
...@@ -77,6 +78,11 @@ ...@@ -77,6 +78,11 @@
<item name="android:windowExitAnimation">@anim/dialog_bottom_out</item> <item name="android:windowExitAnimation">@anim/dialog_bottom_out</item>
</style> </style>
<style name="DialogAnimFade" parent="@android:style/Animation">
<item name="android:windowEnterAnimation">@anim/fade_in</item>
<item name="android:windowExitAnimation">@anim/fade_out</item>
</style>
<style name="CustomCheckboxTheme" parent="@android:style/Widget.CompoundButton.CheckBox"> <style name="CustomCheckboxTheme" parent="@android:style/Widget.CompoundButton.CheckBox">
<item name="android:button">@drawable/checkbox_style</item> <item name="android:button">@drawable/checkbox_style</item>
</style> </style>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment