Commit f152a0f0 authored by wanglei's avatar wanglei

...

parent 118a34f7
...@@ -2,7 +2,6 @@ package com.base.appzxhy.ui.main ...@@ -2,7 +2,6 @@ package com.base.appzxhy.ui.main
import android.content.Intent import android.content.Intent
import androidx.core.view.updatePadding import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
...@@ -52,6 +51,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl ...@@ -52,6 +51,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
}) })
} }
private val categories = arrayListOf<Long>()
private fun initCategoryAdapter() { private fun initCategoryAdapter() {
val activity = requireActivity() as MainActivity? val activity = requireActivity() as MainActivity?
lifecycleScope.launch { lifecycleScope.launch {
...@@ -61,6 +61,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl ...@@ -61,6 +61,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
kotlin.runCatching { kotlin.runCatching {
ids = list[0].categories[0].id ids = list[0].categories[0].id
} }
if (!categories.contains(ids)) {
categories.add(ids)
val categoryTitle = activity.viewModel.categoryTitle(requireContext(), ids) val categoryTitle = activity.viewModel.categoryTitle(requireContext(), ids)
val categoryAdapter = ShortPlayCategoryAdapter(categoryTitle, list) val categoryAdapter = ShortPlayCategoryAdapter(categoryTitle, list)
categoryAdapter.itemClick = ::shortPlayClick categoryAdapter.itemClick = ::shortPlayClick
...@@ -72,6 +74,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl ...@@ -72,6 +74,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
} }
} }
} }
}
private fun initBannerAdapter() { private fun initBannerAdapter() {
val activity = requireActivity() as MainActivity? val activity = requireActivity() as MainActivity?
......
package com.base.appzxhy.ui.play package com.base.appzxhy.ui.play
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color
import android.util.AttributeSet import android.util.AttributeSet
import android.util.SparseArray
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.TextView
import androidx.core.graphics.ColorUtils
import androidx.interpolator.view.animation.FastOutLinearInInterpolator
import com.base.appzxhy.R import com.base.appzxhy.R
import com.base.appzxhy.databinding.LayoutOverlayForyouBinding import com.base.appzxhy.databinding.LayoutOverlayForyouBinding
import com.base.appzxhy.databinding.LayoutOverlayPlayerBinding
import com.base.appzxhy.ui.play.effect.AnimationEffect
import com.base.appzxhy.utils.KotlinExt.formatSeconds
import com.base.appzxhy.utils.LogEx
import com.base.appzxhy.utils.Utils.dp
import com.bytedance.sdk.shortplay.api.PSSDK import com.bytedance.sdk.shortplay.api.PSSDK
import com.bytedance.sdk.shortplay.api.ShortPlay import com.bytedance.sdk.shortplay.api.ShortPlay
import com.bytedance.sdk.shortplay.api.ShortPlayFragment import com.bytedance.sdk.shortplay.api.ShortPlayFragment
import com.litao.slider.NiftySlider
/** /**
* 自定义播放页面悬浮成 * 自定义播放页面悬浮成
*/ */
class CustomOverlayView : FrameLayout, PSSDK.IControlView { class CustomOverlayView : FrameLayout, PSSDK.IControlView {
private val TAG = "CustomOverlayView"
private var layout: Int = 0 private var layout: Int = 0
private var niftySlider: NiftySlider? = null
private var tvPlayNow: TextView? = null
private var tvPlayTotal: TextView? = null
var bindItemDataCallBack: ((index: Int, customOverlayView: CustomOverlayView) -> Unit)? = null
constructor(context: Context, layout: Int) : super(context) { constructor(context: Context, layout: Int) : super(context) {
this.layout = layout this.layout = layout
...@@ -37,8 +58,86 @@ class CustomOverlayView : FrameLayout, PSSDK.IControlView { ...@@ -37,8 +58,86 @@ class CustomOverlayView : FrameLayout, PSSDK.IControlView {
binding.tvDesc.text = shortPlay.desc binding.tvDesc.text = shortPlay.desc
} }
R.layout.layout_overlay_player -> {
val binding = LayoutOverlayPlayerBinding.bind(this)
niftySlider = binding.niftySlider
tvPlayNow = binding.tvPlayNow
tvPlayTotal = binding.tvPlayTotal
val thumbColor = ColorUtils.compositeColors(ColorUtils.setAlphaComponent(Color.WHITE, 0x55), Color.BLACK)
val trackColor = ColorUtils.setAlphaComponent(Color.WHITE, 0x33)
val inactiveColor = ColorUtils.setAlphaComponent(Color.WHITE, 0x11)
val animEffect = AnimationEffect(binding.niftySlider).apply {
srcTrackHeight = 3.dp
srcThumbHeight = 6.dp
srcThumbWidth = 6.dp
srcThumbRadius = 3.dp
srcThumbColor = thumbColor
srcTrackColor = trackColor
srcInactiveTrackColor = inactiveColor
targetTrackHeight = 12.dp
targetThumbHeight = 16.dp
targetThumbWidth = 8.dp
targetThumbRadius = 5.dp
targetThumbColor = Color.WHITE
targetTrackColor = ColorUtils.setAlphaComponent(Color.WHITE, 0xDD)
targetInactiveTrackColor = ColorUtils.setAlphaComponent(Color.WHITE, 0x33)
animationListener = object : AnimationEffect.OnAnimationChangeListener {
override fun onEnd(slider: NiftySlider) {
// Toast.makeText(requireContext(), "do something on animation end", Toast.LENGTH_SHORT).show()
}
}
setInterpolator(FastOutLinearInInterpolator())
}
binding.niftySlider.apply {
effect = animEffect
setTrackTintList(ColorStateList.valueOf(trackColor))
setTrackInactiveTintList(ColorStateList.valueOf(inactiveColor))
setThumbTintList(ColorStateList.valueOf(thumbColor))
setThumbShadowColor(Color.BLACK)
}
bindItemDataCallBack?.invoke(index, this)
}
}
}
@SuppressLint("SetTextI18n")
fun onProgressChange(currentPlayTimeInSeconds: Int, durationInSeconds: Int) {
// LogEx.logDebug(TAG, "currentPlayTimeInSeconds=$currentPlayTimeInSeconds durationInSeconds=$durationInSeconds")
if (niftySlider?.valueTo != durationInSeconds.toFloat()) {
LogEx.logDebug(TAG, "change Progress max")
niftySlider?.valueFrom = 0f
niftySlider?.valueTo = durationInSeconds.toFloat()
niftySlider?.setValue(0f, false)
tvPlayNow?.text = 0L.formatSeconds() + " / "
tvPlayTotal?.text = durationInSeconds.toLong().formatSeconds()
} else {
niftySlider?.setValue(currentPlayTimeInSeconds.toFloat(), false)
tvPlayNow?.text = currentPlayTimeInSeconds.toLong().formatSeconds() + " / "
}
}
@SuppressLint("SetTextI18n")
fun bindProgressChange(shortPlayFragment: ShortPlayFragment?) {
if (layout == R.layout.layout_overlay_player) {
val binding = LayoutOverlayPlayerBinding.bind(this)
binding.niftySlider.addOnValueChangeListener { slider, value, fromUser ->
if (fromUser) {
LogEx.logDebug(TAG, "value=$value")
shortPlayFragment?.setCurrentPlayTimeSeconds(value.toInt())
binding.tvPlayNow.text = value.toLong().formatSeconds() + " / "
} }
} }
}
}
} }
\ No newline at end of file
...@@ -2,13 +2,13 @@ package com.base.appzxhy.ui.play ...@@ -2,13 +2,13 @@ package com.base.appzxhy.ui.play
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.util.SparseArray
import android.view.Gravity import android.view.Gravity
import android.view.View import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
import com.base.appzxhy.R import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity import com.base.appzxhy.base.BaseActivity
import com.base.appzxhy.databinding.ActivityPlayFullBinding import com.base.appzxhy.databinding.ActivityPlayFullBinding
import com.base.appzxhy.shortplay.PlayHistoryHelper
import com.base.appzxhy.ui.views.DialogSelectEP import com.base.appzxhy.ui.views.DialogSelectEP
import com.base.appzxhy.ui.views.ShortPlayEPDialog.showShortPlayEPDialog import com.base.appzxhy.ui.views.ShortPlayEPDialog.showShortPlayEPDialog
import com.base.appzxhy.utils.LogEx import com.base.appzxhy.utils.LogEx
...@@ -21,17 +21,18 @@ import com.bytedance.sdk.shortplay.api.ShortPlay ...@@ -21,17 +21,18 @@ import com.bytedance.sdk.shortplay.api.ShortPlay
import com.bytedance.sdk.shortplay.api.ShortPlayFragment import com.bytedance.sdk.shortplay.api.ShortPlayFragment
import com.google.gson.Gson import com.google.gson.Gson
import com.gyf.immersionbar.ImmersionBar import com.gyf.immersionbar.ImmersionBar
import com.litao.slider.NiftySlider
class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullBinding::inflate) { class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullBinding::inflate) {
private var shortPlay: ShortPlay? = null private var shortPlay: ShortPlay? = null
private var shortPlayFragment: ShortPlayFragment? = null
private var detailFragment: ShortPlayFragment? = null
private var startFromIndex = 1//剧集下标 private var startFromIndex = 1//剧集下标
private val startFromSeconds = 0//开始秒数 private val startFromSeconds = 0//开始秒数
private val playHistory: PlayHistoryHelper.PlayHistory = PlayHistoryHelper.PlayHistory() // private val playHistory: PlayHistoryHelper.PlayHistory = PlayHistoryHelper.PlayHistory()
private val playControlViewSparseArray = SparseArray<CustomOverlayView>()
override fun initView() { override fun initView() {
super.initView() super.initView()
...@@ -43,6 +44,7 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB ...@@ -43,6 +44,7 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
shortPlay?.let { showDetailFragment(it) } shortPlay?.let { showDetailFragment(it) }
shortPlay?.episodes shortPlay?.episodes
} }
override fun initListener() { override fun initListener() {
...@@ -93,14 +95,23 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB ...@@ -93,14 +95,23 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
} }
}) })
builder.progressBarMarginToBottom(10)
builder.enableImmersiveMode(5000) builder.enableImmersiveMode(5000)
builder.enableAutoPlayNext(true) builder.enableAutoPlayNext(false)
builder.displayProgressBar(false) builder.displayProgressBar(false)
detailFragment = PSSDK.createDetailFragment(shortPlay, builder.build(), object : PSSDK.ShortPlayDetailPageListener { shortPlayFragment = PSSDK.createDetailFragment(shortPlay, builder.build(), object : PSSDK.ShortPlayDetailPageListener {
@SuppressLint("SetTextI18n")
override fun onProgressChange(shortPlay: ShortPlay?, index: Int, currentPlayTimeInSeconds: Int, durationInSeconds: Int) { override fun onProgressChange(shortPlay: ShortPlay?, index: Int, currentPlayTimeInSeconds: Int, durationInSeconds: Int) {
LogEx.logDebug(
TAG,
"index=$index startFromIndex=$startFromIndex " +
"currentPlayTimeInSeconds=$currentPlayTimeInSeconds " +
"durationInSeconds=$durationInSeconds"
)
val playControlView: CustomOverlayView? = playControlViewSparseArray.get(index)
playControlView?.onProgressChange(currentPlayTimeInSeconds, durationInSeconds)
} }
override fun onPlayFailed(errorInfo: PSSDK.ErrorInfo?): Boolean { override fun onPlayFailed(errorInfo: PSSDK.ErrorInfo?): Boolean {
...@@ -116,9 +127,11 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB ...@@ -116,9 +127,11 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
} }
override fun onShortPlayPlayed(shortPlay: ShortPlay?, index: Int) { override fun onShortPlayPlayed(shortPlay: ShortPlay?, index: Int) {
playHistory.shortPlay = shortPlay startFromIndex = index
playHistory.index = index LogEx.logDebug(TAG, "onShortPlayPlayed index=$index")
PlayHistoryHelper.savePlayHistory(playHistory) // playHistory.shortPlay = shortPlay
// playHistory.index = index
// PlayHistoryHelper.savePlayHistory(playHistory)
} }
override fun onItemSelected(position: Int, p1: PSSDK.ShortPlayDetailPageListener.ItemType?, index: Int) { override fun onItemSelected(position: Int, p1: PSSDK.ShortPlayDetailPageListener.ItemType?, index: Int) {
...@@ -153,7 +166,7 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB ...@@ -153,7 +166,7 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
override fun onVideoInfoFetched(shortPlay: ShortPlay?, index: Int, videoPlayInfo: PSSDK.VideoPlayInfo?) { override fun onVideoInfoFetched(shortPlay: ShortPlay?, index: Int, videoPlayInfo: PSSDK.VideoPlayInfo?) {
} }
@SuppressLint("RtlHardcoded") @SuppressLint("RtlHardcoded", "SetTextI18n")
override fun onObtainPlayerControlViews(): MutableList<View> { override fun onObtainPlayerControlViews(): MutableList<View> {
val views = java.util.ArrayList<View>() val views = java.util.ArrayList<View>()
...@@ -194,16 +207,16 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB ...@@ -194,16 +207,16 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
customPEView.setLayoutParams(peParams) customPEView.setLayoutParams(peParams)
views.add(customPEView) views.add(customPEView)
customPEView.setOnClickListener { customPEView.setOnClickListener {
detailFragment?.pausePlay() shortPlayFragment?.pausePlay()
showShortPlayEPDialog(shortPlay.total, startFromIndex, 5, object : DialogSelectEP { showShortPlayEPDialog(shortPlay.total, startFromIndex, 5, object : DialogSelectEP {
override fun dismissAction() { override fun dismissAction() {
detailFragment?.startPlay() shortPlayFragment?.startPlay()
} }
override fun selectEPAction(ep: Int) { override fun selectEPAction(ep: Int) {
super.selectEPAction(ep) super.selectEPAction(ep)
startFromIndex = ep startFromIndex = ep
detailFragment?.startPlayIndex(startFromIndex) shortPlayFragment?.startPlayIndex(startFromIndex)
} }
}) })
} }
...@@ -231,17 +244,21 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB ...@@ -231,17 +244,21 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
val playControlView = CustomOverlayView(this@PlayFullActivity, R.layout.layout_overlay_player) val playControlView = CustomOverlayView(this@PlayFullActivity, R.layout.layout_overlay_player)
playControlView.layoutParams = playControlView.layoutParams =
FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT) FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)
views.add(playControlView) playControlView.let { views.add(it) }
//全局持有控制view
playControlView.bindItemDataCallBack = { index, view ->
playControlViewSparseArray[index] = view
}
playControlView.bindProgressChange(shortPlayFragment)
return views return views
} }
}) })
if (detailFragment == null) { if (shortPlayFragment == null) {
LogEx.logDebug(TAG, "create detailFragment failed") LogEx.logDebug(TAG, "create detailFragment failed")
return return
} }
detailFragment?.let { shortPlayFragment?.let {
// 将播放页展示出来 // 将播放页展示出来
supportFragmentManager.beginTransaction() supportFragmentManager.beginTransaction()
.add(R.id.fragment_container, it) .add(R.id.fragment_container, it)
......
package com.base.appzxhy.ui.play
import android.animation.ValueAnimator
import androidx.annotation.FloatRange
/**
* @author : litao
* @date : 2023/3/6 16:01
*/
class SliderValueAnimation : ValueAnimator() {
private var isAnimReversed = false
companion object {
const val DEFAULT_DURATION = 500L
}
init {
setFloatValues(0f, 1f)
duration = DEFAULT_DURATION
}
override fun getAnimatedValue(): Any {
return super.getAnimatedValue()
}
@FloatRange(from = 0.0, to = 1.0)
fun getAnimatedValueAbsolute(): Float {
return animatedValue.toString().toFloat()
}
override fun start() {
isAnimReversed = false
super.start()
}
override fun reverse() {
isAnimReversed = true
super.reverse()
}
fun isReversed(): Boolean {
return isAnimReversed
}
}
\ No newline at end of file
package com.base.appzxhy.ui.play.effect
import android.animation.TimeInterpolator
import android.content.res.ColorStateList
import androidx.annotation.ColorInt
import androidx.core.animation.doOnEnd
import androidx.core.graphics.ColorUtils
import androidx.core.view.ViewCompat
import com.base.appzxhy.ui.play.SliderValueAnimation
import com.litao.slider.NiftySlider
/**
* @author : litao
* @date : 2023/3/6 10:40
*/
class AnimationEffect(private val slider: NiftySlider) : BaseEffect() {
private val sliderAnimation = SliderValueAnimation()
var animDuration = 500L
set(value) {
field = value
sliderAnimation.duration = animDuration
}
var endAnimDelay = 0L
var srcTrackHeight = UNSET
var srcThumbRadius = UNSET
var srcThumbWidth = UNSET
var srcThumbHeight = UNSET
var srcThumbColor = UNSET_COLOR
var srcTrackColor = UNSET_COLOR
var srcInactiveTrackColor = UNSET_COLOR
var targetTrackHeight = UNSET
var targetThumbRadius = UNSET
var targetThumbWidth = UNSET
var targetThumbHeight = UNSET
var targetThumbColor = UNSET_COLOR
var targetTrackColor = UNSET_COLOR
var targetInactiveTrackColor = UNSET_COLOR
var animationListener: OnAnimationChangeListener? = null
companion object {
const val UNSET = -1
const val UNSET_COLOR = Int.MAX_VALUE
}
interface OnAnimationChangeListener {
fun onEnd(slider: NiftySlider)
}
init {
sliderAnimation.apply {
addUpdateListener { animationUpdate(getAnimatedValueAbsolute()) }
doOnEnd {
if (isReversed()) {
if (ViewCompat.isAttachedToWindow(slider)) {
animationListener?.onEnd(slider)
}
}
}
}
}
override fun onStartTacking(slider: NiftySlider) {
super.onStartTacking(slider)
startAnim(false)
}
override fun onStopTacking(slider: NiftySlider) {
super.onStopTacking(slider)
startAnim(true)
}
fun startAnim(isReversed: Boolean) {
sliderAnimation.apply {
if (isReversed) {
if (endAnimDelay > 0) {
slider.postDelayed({
if (ViewCompat.isAttachedToWindow(slider)) {
reverse()
}
}, endAnimDelay)
} else {
reverse()
}
} else {
start()
}
}
}
/**
* update slider animation
*/
fun animationUpdate(value: Float) {
updateTrackHeight(value)
updateThumbSize(value)
updateThumbColor(value)
updateTrackColor(value)
updateInactiveTrackColor(value)
slider.postInvalidate()
}
/**
* update track height with animation
*/
private fun updateTrackHeight(value: Float) {
if (targetTrackHeight != UNSET) {
val height = getValueByFraction(srcTrackHeight, targetTrackHeight, value).toInt()
slider.trackThickness = height
}
}
/**
* update thumb size with animation
*/
private fun updateThumbSize(value: Float) {
if (targetThumbWidth != UNSET || targetThumbHeight != UNSET) {
val h = if (targetThumbHeight >= 0) {
getValueByFraction(srcThumbHeight, targetThumbHeight, value).toInt()
} else {
srcThumbHeight
}
val w = if (targetThumbWidth >= 0) {
getValueByFraction(srcThumbWidth, targetThumbWidth, value).toInt()
} else {
srcThumbWidth
}
val r = if (targetThumbRadius >= 0) {
getValueByFraction(srcThumbRadius, targetThumbRadius, value).toInt()
} else {
srcThumbRadius
}
slider.setThumbWidthAndHeight(w, h, r)
} else if (targetThumbRadius != UNSET) {
slider.thumbRadius = getValueByFraction(srcThumbRadius, targetThumbRadius, value).toInt()
}
}
/**
* update thumb color with animation
*/
private fun updateThumbColor(value: Float) {
if (targetThumbColor != UNSET_COLOR) {
slider.setThumbTintList(ColorStateList.valueOf(getColorByFraction(srcThumbColor, targetThumbColor, value)))
}
}
/**
* update track color with animation
*/
private fun updateTrackColor(value: Float) {
if (targetTrackColor != UNSET_COLOR) {
slider.setTrackTintList(ColorStateList.valueOf(getColorByFraction(srcTrackColor, targetTrackColor, value)))
}
}
/**
* update inactive track color with animation
*/
private fun updateInactiveTrackColor(value: Float) {
if (targetInactiveTrackColor != UNSET_COLOR) {
slider.setTrackInactiveTintList(
ColorStateList.valueOf(
getColorByFraction(
srcInactiveTrackColor,
targetInactiveTrackColor,
value
)
)
)
}
}
/**
* Sets the interpolator of this animation effect
*/
fun setInterpolator(interpolator: TimeInterpolator) {
sliderAnimation.interpolator = interpolator
}
private fun getValueByFraction(srcValue: Int, targetValue: Int, fraction: Float): Float {
return srcValue + ((targetValue - srcValue) * fraction)
}
@ColorInt
private fun getColorByFraction(srcColor: Int, targetColor: Int, fraction: Float): Int {
return ColorUtils.blendARGB(srcColor, targetColor, fraction)
}
}
\ No newline at end of file
package com.base.appzxhy.ui.play.effect
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.PointF
import android.graphics.RectF
import com.litao.slider.NiftySlider
import com.litao.slider.SliderEffect
/**
* @author : litao
* @date : 2023/2/21 15:18
*/
open class BaseEffect : SliderEffect<NiftySlider> {
companion object{
const val HIGH_QUALITY_FLAGS = Paint.ANTI_ALIAS_FLAG or Paint.DITHER_FLAG
}
override fun onStartTacking(slider: NiftySlider) {
}
override fun onStopTacking(slider: NiftySlider) {
}
override fun onValueChanged(slider: NiftySlider, value: Float, fromUser: Boolean) {
}
override fun dispatchDrawInactiveTrackBefore(slider: NiftySlider, canvas: Canvas, trackRect: RectF, trackCenter: Float): Boolean {
return false
}
override fun drawInactiveTrackAfter(slider: NiftySlider, canvas: Canvas, trackRect: RectF, trackCenter: Float) {
}
override fun dispatchDrawTrackBefore(slider: NiftySlider, canvas: Canvas, trackRect: RectF, inactiveTrackRect:RectF, trackCenter: Float): Boolean {
return false
}
override fun drawTrackAfter(slider: NiftySlider, canvas: Canvas, trackRect: RectF, inactiveTrackRect:RectF, trackCenter: Float) {
}
override fun dispatchDrawThumbBefore(slider: NiftySlider, canvas: Canvas, cx: Float, cy: Float): Boolean {
return false
}
override fun drawThumbAfter(slider: NiftySlider, canvas: Canvas, cx: Float, cy: Float) {
}
override fun dispatchDrawSecondaryTrackBefore(
slider: NiftySlider,
canvas: Canvas,
trackRect: RectF,
inactiveTrackRect: RectF,
trackCenter: Float
): Boolean {
return false
}
override fun drawSecondaryTrackAfter(slider: NiftySlider, canvas: Canvas, trackRect: RectF, inactiveTrackRect: RectF, trackCenter: Float) {
}
override fun onDrawBefore(canvas: Canvas, trackRect: RectF, trackCenter: Float) {
}
override fun onDrawAfter(canvas: Canvas, trackRect: RectF, trackCenter: Float) {
}
override fun drawIndicatorsAfter(slider: NiftySlider, canvas: Canvas, trackRect: RectF, trackCenter: Float) {
}
override fun drawIndicatorAfter(slider: NiftySlider, canvas: Canvas, trackRect: RectF, indicatorPoint: PointF, index:Int) {
}
override fun dispatchDrawIndicatorBefore(
slider: NiftySlider,
canvas: Canvas,
trackRect: RectF,
indicatorPoint: PointF,
index:Int
): Boolean {
return false
}
override fun dispatchDrawIndicatorsBefore(
slider: NiftySlider,
canvas: Canvas,
trackRect: RectF,
trackCenter: Float
): Boolean {
return false
}
override fun updateDirtyData() {
}
}
\ No newline at end of file
...@@ -61,7 +61,9 @@ class ShortPlayViewModel : ViewModel() { ...@@ -61,7 +61,9 @@ class ShortPlayViewModel : ViewModel() {
addAll(tempCategoryList) addAll(tempCategoryList)
} }
/**
* 按分类顺序获取列表
*/
fun getCategoryListFlow( fun getCategoryListFlow(
reload: Boolean = false, reload: Boolean = false,
count: Int = 12, count: Int = 12,
......
package com.base.appzxhy.utils package com.base.appzxhy.utils
import android.annotation.SuppressLint
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Calendar import java.util.Calendar
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
import kotlin.time.Duration
import kotlin.time.toDuration
object KotlinExt { object KotlinExt {
...@@ -49,6 +53,18 @@ object KotlinExt { ...@@ -49,6 +53,18 @@ object KotlinExt {
return SimpleDateFormat("HH:mm", Locale.ENGLISH).format(this) return SimpleDateFormat("HH:mm", Locale.ENGLISH).format(this)
} }
@SuppressLint("DefaultLocale")
fun Long.formatSeconds(): String {
val hours = TimeUnit.SECONDS.toHours(this)
val minutes = TimeUnit.SECONDS.toMinutes(this) % 60
val seconds = this % 60
return if (hours > 0) {
String.format("%02d:%02d:%02d", hours, minutes, seconds)
} else {
String.format("%02d:%02d", minutes, seconds)
}
}
fun Array<String>.array2String(): String { fun Array<String>.array2String(): String {
val stringBuilder = StringBuilder() val stringBuilder = StringBuilder()
......
package com.base.appzxhy.utils
import android.content.Context
import android.content.res.Resources
import android.util.TypedValue
import androidx.annotation.ColorInt
import androidx.annotation.Dimension
import kotlin.math.floor
import kotlin.math.roundToInt
/**
* @author : litao
* @date : 2023/2/21 16:41
*/
object Utils {
val Float.dp: Float
get() = Utils.dpToPxF(this)
val Int.dp: Int
get() = Utils.dpToPx(this)
fun setColorAlpha(@ColorInt color: Int, alpha: Float): Int {
val origin = (0xff) and 0xff
return color and 0x00ffffff or ((alpha * origin).toInt() shl 24)
}
fun toHexColorString(@ColorInt color: Int): String {
return "#%06X".format(0xFFFFFF and color)
}
fun dpToPx(@Dimension(unit = Dimension.DP) dp: Int): Int {
val r = Resources.getSystem()
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp.toFloat(), r.displayMetrics).roundToInt()
}
fun dpToPxF(@Dimension(unit = Dimension.DP) dp: Float): Float {
val r = Resources.getSystem()
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.displayMetrics)
}
fun formatVideoTime(milliseconds: Long): String {
val totalSeconds = floor(milliseconds.toDouble() / 1000)
val secondsLeft = totalSeconds % 3600
val minutes = floor(secondsLeft / 60).toInt()
val seconds = (secondsLeft % 60).toInt()
val m = if (minutes < 10) {
"0$minutes"
} else {
minutes.toString()
}
val s = if (seconds < 10) {
"0$seconds";
} else {
seconds.toString()
}
return "$m:$s";
}
}
\ No newline at end of file
...@@ -11,14 +11,74 @@ ...@@ -11,14 +11,74 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:layout_marginBottom="60dp"> android:background="@color/black">
<!-- <TextView--> <com.litao.slider.NiftySlider
<!-- android:id="@+id/tvPlaySecond"--> android:id="@+id/nifty_slider"
<!-- android:layout_width="wrap_content"--> android:layout_width="match_parent"
<!-- android:layout_height="wrap_content" />--> android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:valueFrom="0"
app:enableDrawHalo="false"
app:isConsecutiveProgress="true"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:thumbRadius="3dp"
app:thumbWithinTrackBounds="true"
app:trackHeight="3dp"
app:trackInnerHPadding="0dp" />
<TextView
android:id="@+id/tvPlayNow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:textColor="@color/white"
android:textSize="13sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@id/nifty_slider"
app:layout_constraintTop_toBottomOf="@id/nifty_slider"
android:text="00:00 / " />
<TextView
android:id="@+id/tvPlayTotal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#80FFFFFF"
android:textSize="13sp"
app:layout_constraintStart_toEndOf="@id/tvPlayNow"
app:layout_constraintTop_toTopOf="@id/tvPlayNow"
android:text="00:00" />
<TextView
android:id="@+id/tvQuality"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="18dp"
android:text="@string/auto"
android:textColor="@color/white"
android:textSize="13sp"
app:layout_constraintBottom_toBottomOf="@id/tvPlayNow"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/tvPlayNow" />
<TextView
android:id="@+id/tvSpeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="26dp"
android:text="1.0x"
android:textColor="@color/white"
android:textSize="13sp"
app:layout_constraintBottom_toBottomOf="@id/tvPlayNow"
app:layout_constraintEnd_toStartOf="@id/tvQuality"
app:layout_constraintTop_toTopOf="@id/tvPlayNow"
tools:ignore="HardcodedText" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
......
...@@ -30,5 +30,6 @@ ...@@ -30,5 +30,6 @@
<string name="list">List</string> <string name="list">List</string>
<string name="discover_more">Discover More</string> <string name="discover_more">Discover More</string>
<string name="nothing_here_yet_add_something">Nothing here yet - Add something!</string> <string name="nothing_here_yet_add_something">Nothing here yet - Add something!</string>
<string name="auto">Auto</string>
</resources> </resources>
\ No newline at end of file
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