Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
R
reelshort white
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
reelshort white
Commits
f152a0f0
Commit
f152a0f0
authored
Jan 15, 2025
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
118a34f7
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
647 additions
and
32 deletions
+647
-32
HomeFragment.kt
app/src/main/java/com/base/appzxhy/ui/main/HomeFragment.kt
+10
-7
CustomOverlayView.kt
...c/main/java/com/base/appzxhy/ui/play/CustomOverlayView.kt
+99
-0
PlayFullActivity.kt
...rc/main/java/com/base/appzxhy/ui/play/PlayFullActivity.kt
+36
-19
SliderValueAnimation.kt
...ain/java/com/base/appzxhy/ui/play/SliderValueAnimation.kt
+50
-0
AnimationEffect.kt
...n/java/com/base/appzxhy/ui/play/effect/AnimationEffect.kt
+206
-0
BaseEffect.kt
...c/main/java/com/base/appzxhy/ui/play/effect/BaseEffect.kt
+98
-0
ShortPlayViewModel.kt
...rc/main/java/com/base/appzxhy/ui/vm/ShortPlayViewModel.kt
+3
-1
KotlinExt.kt
app/src/main/java/com/base/appzxhy/utils/KotlinExt.kt
+16
-0
Utils.kt
app/src/main/java/com/base/appzxhy/utils/Utils.kt
+63
-0
layout_overlay_player.xml
app/src/main/res/layout/layout_overlay_player.xml
+65
-5
strings.xml
app/src/main/res/values/strings.xml
+1
-0
No files found.
app/src/main/java/com/base/appzxhy/ui/main/HomeFragment.kt
View file @
f152a0f0
...
@@ -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,13 +61,16 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
...
@@ -61,13 +61,16 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
kotlin
.
runCatching
{
kotlin
.
runCatching
{
ids
=
list
[
0
].
categories
[
0
].
id
ids
=
list
[
0
].
categories
[
0
].
id
}
}
val
categoryTitle
=
activity
.
viewModel
.
categoryTitle
(
requireContext
(),
ids
)
if
(!
categories
.
contains
(
ids
))
{
val
categoryAdapter
=
ShortPlayCategoryAdapter
(
categoryTitle
,
list
)
categories
.
add
(
ids
)
categoryAdapter
.
itemClick
=
::
shortPlayClick
val
categoryTitle
=
activity
.
viewModel
.
categoryTitle
(
requireContext
(),
ids
)
categoryAdapter
.
categoryClick
=
{
val
categoryAdapter
=
ShortPlayCategoryAdapter
(
categoryTitle
,
list
)
jumpCategory
(
ids
)
categoryAdapter
.
itemClick
=
::
shortPlayClick
categoryAdapter
.
categoryClick
=
{
jumpCategory
(
ids
)
}
contactAdapter
?.
addAdapter
(
categoryAdapter
)
}
}
contactAdapter
?.
addAdapter
(
categoryAdapter
)
}
}
}
}
}
}
...
...
app/src/main/java/com/base/appzxhy/ui/play/CustomOverlayView.kt
View file @
f152a0f0
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
,
0
x55
),
Color
.
BLACK
)
val
trackColor
=
ColorUtils
.
setAlphaComponent
(
Color
.
WHITE
,
0
x33
)
val
inactiveColor
=
ColorUtils
.
setAlphaComponent
(
Color
.
WHITE
,
0
x11
)
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
,
0
xDD
)
targetInactiveTrackColor
=
ColorUtils
.
setAlphaComponent
(
Color
.
WHITE
,
0
x33
)
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
app/src/main/java/com/base/appzxhy/ui/play/PlayFullActivity.kt
View file @
f152a0f0
...
@@ -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
(
tru
e
)
builder
.
enableAutoPlayNext
(
fals
e
)
builder
.
displayProgressBar
(
false
)
builder
.
displayProgressBar
(
false
)
detail
Fragment
=
PSSDK
.
createDetailFragment
(
shortPlay
,
builder
.
build
(),
object
:
PSSDK
.
ShortPlayDetailPageListener
{
shortPlay
Fragment
=
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
{
detail
Fragment
?.
pausePlay
()
shortPlay
Fragment
?.
pausePlay
()
showShortPlayEPDialog
(
shortPlay
.
total
,
startFromIndex
,
5
,
object
:
DialogSelectEP
{
showShortPlayEPDialog
(
shortPlay
.
total
,
startFromIndex
,
5
,
object
:
DialogSelectEP
{
override
fun
dismissAction
()
{
override
fun
dismissAction
()
{
detail
Fragment
?.
startPlay
()
shortPlay
Fragment
?.
startPlay
()
}
}
override
fun
selectEPAction
(
ep
:
Int
)
{
override
fun
selectEPAction
(
ep
:
Int
)
{
super
.
selectEPAction
(
ep
)
super
.
selectEPAction
(
ep
)
startFromIndex
=
ep
startFromIndex
=
ep
detail
Fragment
?.
startPlayIndex
(
startFromIndex
)
shortPlay
Fragment
?.
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
(
detail
Fragment
==
null
)
{
if
(
shortPlay
Fragment
==
null
)
{
LogEx
.
logDebug
(
TAG
,
"create detailFragment failed"
)
LogEx
.
logDebug
(
TAG
,
"create detailFragment failed"
)
return
return
}
}
detail
Fragment
?.
let
{
shortPlay
Fragment
?.
let
{
// 将播放页展示出来
// 将播放页展示出来
supportFragmentManager
.
beginTransaction
()
supportFragmentManager
.
beginTransaction
()
.
add
(
R
.
id
.
fragment_container
,
it
)
.
add
(
R
.
id
.
fragment_container
,
it
)
...
...
app/src/main/java/com/base/appzxhy/ui/play/SliderValueAnimation.kt
0 → 100644
View file @
f152a0f0
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
app/src/main/java/com/base/appzxhy/ui/play/effect/AnimationEffect.kt
0 → 100644
View file @
f152a0f0
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
app/src/main/java/com/base/appzxhy/ui/play/effect/BaseEffect.kt
0 → 100644
View file @
f152a0f0
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
app/src/main/java/com/base/appzxhy/ui/vm/ShortPlayViewModel.kt
View file @
f152a0f0
...
@@ -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
,
...
...
app/src/main/java/com/base/appzxhy/utils/KotlinExt.kt
View file @
f152a0f0
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
()
...
...
app/src/main/java/com/base/appzxhy/utils/Utils.kt
0 → 100644
View file @
f152a0f0
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
=
(
0
xff
)
and
0
xff
return
color
and
0
x00ffffff
or
((
alpha
*
origin
).
toInt
()
shl
24
)
}
fun
toHexColorString
(
@ColorInt
color
:
Int
):
String
{
return
"#%06X"
.
format
(
0
xFFFFFF
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
app/src/main/res/layout/layout_overlay_player.xml
View file @
f152a0f0
...
@@ -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>
...
...
app/src/main/res/values/strings.xml
View file @
f152a0f0
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment