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
55a87036
Commit
55a87036
authored
Jan 15, 2025
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...
parent
f152a0f0
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
720 additions
and
95 deletions
+720
-95
BaseFragment.kt
app/src/main/java/com/base/appzxhy/base/BaseFragment.kt
+1
-1
HomeFragment.kt
app/src/main/java/com/base/appzxhy/ui/main/HomeFragment.kt
+5
-1
MainActivity.kt
app/src/main/java/com/base/appzxhy/ui/main/MainActivity.kt
+44
-48
PlaySlideFragment.kt
...c/main/java/com/base/appzxhy/ui/main/PlaySlideFragment.kt
+137
-0
CustomOverlayView.kt
...c/main/java/com/base/appzxhy/ui/play/CustomOverlayView.kt
+5
-19
PlayFullActivity.kt
...rc/main/java/com/base/appzxhy/ui/play/PlayFullActivity.kt
+67
-9
ShortPlayQualityDialog.kt
.../java/com/base/appzxhy/ui/views/ShortPlayQualityDialog.kt
+69
-3
ShortPlaySpeedDialog.kt
...in/java/com/base/appzxhy/ui/views/ShortPlaySpeedDialog.kt
+60
-4
bg_2d2f3d_10.xml
app/src/main/res/drawable/bg_2d2f3d_10.xml
+7
-0
bg_stroke_33ffffff_4d030303_5.xml
app/src/main/res/drawable/bg_stroke_33ffffff_4d030303_5.xml
+9
-0
bg_stroke_33ffffff_4dff3d71_5.xml
app/src/main/res/drawable/bg_stroke_33ffffff_4dff3d71_5.xml
+9
-0
activity_main.xml
app/src/main/res/layout/activity_main.xml
+2
-3
dialog_play_quality.xml
app/src/main/res/layout/dialog_play_quality.xml
+99
-1
dialog_play_speed.xml
app/src/main/res/layout/dialog_play_speed.xml
+149
-1
fragment_play_slide.xml
app/src/main/res/layout/fragment_play_slide.xml
+4
-0
layout_overlay_player.xml
app/src/main/res/layout/layout_overlay_player.xml
+51
-5
genduo.png
app/src/main/res/mipmap-xxhdpi/genduo.png
+0
-0
guanbi.png
app/src/main/res/mipmap-xxhdpi/guanbi.png
+0
-0
strings.xml
app/src/main/res/values/strings.xml
+2
-0
No files found.
app/src/main/java/com/base/appzxhy/base/BaseFragment.kt
View file @
55a87036
...
...
@@ -20,7 +20,7 @@ abstract class BaseFragment<VB : ViewBinding>(
private
val
bindingInflater
:
(
LayoutInflater
,
ViewGroup
?,
Boolean
)
->
VB
)
:
Fragment
()
{
private
var
_binding
:
VB
?
=
null
private
var
fragmentInit
=
false
var
fragmentInit
=
false
open
val
TAG
=
javaClass
.
simpleName
//重写binding get()方法不直接暴露真实的可空_binding数据
...
...
app/src/main/java/com/base/appzxhy/ui/main/HomeFragment.kt
View file @
55a87036
...
...
@@ -81,7 +81,9 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
bannerAdapter
=
BannerAdapter
()
bannerAdapter
?.
let
{
it
.
paletteAction
=
{
binding
.
root
.
setBackgroundColor
(
it
)
if
(
isVisible
&&
fragmentInit
)
{
binding
.
root
.
setBackgroundColor
(
it
)
}
}
it
.
playAction
=
{
shortPlay
->
startActivity
(
Intent
(
activity
,
PlayFullActivity
::
class
.
java
).
apply
{
...
...
@@ -105,6 +107,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
super
.
onResumeOneShoot
()
val
activity
=
requireActivity
()
as
MainActivity
?
activity
?.
viewModel
?.
getPopularDrama
()
activity
?.
viewModel
?.
getNewDrama
()
activity
?.
viewModel
?.
getCategoryListFlow
(
true
)
}
...
...
app/src/main/java/com/base/appzxhy/ui/main/MainActivity.kt
View file @
55a87036
...
...
@@ -5,8 +5,8 @@ import android.view.LayoutInflater
import
android.widget.TextView
import
androidx.fragment.app.Fragment
import
androidx.lifecycle.ViewModelProvider
import
androidx.
navigation.NavControll
er
import
androidx.
navigation.fragment.NavHostFragment
import
androidx.
viewpager2.adapter.FragmentStateAdapt
er
import
androidx.
viewpager2.widget.ViewPager2
import
com.base.appzxhy.R
import
com.base.appzxhy.base.BaseActivity
import
com.base.appzxhy.bean.HomeTabUIBean
...
...
@@ -20,7 +20,6 @@ import com.gyf.immersionbar.ktx.immersionBar
class
MainActivity
:
BaseActivity
<
ActivityMainBinding
>(
ActivityMainBinding
::
inflate
)
{
private
lateinit
var
navController
:
NavController
private
val
homeTabs
by
lazy
{
arrayOf
(
HomeTabUIBean
(
R
.
drawable
.
bg_selector_home
,
getString
(
R
.
string
.
home
)),
...
...
@@ -34,24 +33,57 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
ViewModelProvider
(
this
)[
ShortPlayViewModel
::
class
.
java
]
}
private
val
homeFragment
by
lazy
(
LazyThreadSafetyMode
.
NONE
)
{
HomeFragment
()
}
private
val
slideFragment
by
lazy
(
LazyThreadSafetyMode
.
NONE
)
{
PlaySlideFragment
()
}
private
val
myListFragment
by
lazy
(
LazyThreadSafetyMode
.
NONE
)
{
MyListFragment
()
}
private
val
rewardsFragment
by
lazy
(
LazyThreadSafetyMode
.
NONE
)
{
RewardsFragment
()
}
private
val
profileFragment
by
lazy
(
LazyThreadSafetyMode
.
NONE
)
{
ProfileFragment
()
}
private
val
fragments
=
arrayOf
(
homeFragment
,
slideFragment
,
myListFragment
,
rewardsFragment
,
profileFragment
)
private
var
pageAdapter
:
FragmentStateAdapter
?
=
null
override
fun
initView
()
{
super
.
initView
()
navController
=
(
supportFragmentManager
.
findFragmentById
(
R
.
id
.
fragment_container
)
as
NavHostFragment
).
navController
initViewPager2
()
initTab
()
}
navController
.
addOnDestinationChangedListener
{
controller
,
destination
,
arguments
->
LogEx
.
logDebug
(
TAG
,
"addOnDestinationChangedListener"
)
private
fun
initViewPager2
()
{
pageAdapter
=
object
:
FragmentStateAdapter
(
this
)
{
override
fun
getItemCount
():
Int
{
return
fragments
.
size
}
if
(
destination
.
id
==
R
.
id
.
homeFragment
)
{
LogEx
.
logDebug
(
TAG
,
"addOnDestinationChangedListener homeFragment"
)
override
fun
createFragment
(
position
:
Int
):
Fragment
{
return
fragments
[
position
]
}
}
binding
.
viewPager2
.
run
{
isUserInputEnabled
=
false
//https://www.jianshu.com/p/f69bd30cf5b0
//FragmentStateAdapter 这里必须传人fragment
adapter
=
pageAdapter
}
binding
.
viewPager2
.
registerOnPageChangeCallback
(
object
:
ViewPager2
.
OnPageChangeCallback
()
{
initTab
()
override
fun
onPageScrolled
(
position
:
Int
,
positionOffset
:
Float
,
positionOffsetPixels
:
Int
)
{
super
.
onPageScrolled
(
position
,
positionOffset
,
positionOffsetPixels
)
}
viewModel
.
getPopularDrama
()
viewModel
.
getNewDrama
()
override
fun
onPageSelected
(
position
:
Int
)
{
}
})
}
private
fun
initTab
()
{
...
...
@@ -85,42 +117,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
defaultTab
?.
setSelected
()
}
private
fun
naviFragment
(
id
:
Int
)
{
when
(
id
)
{
0
->
{
if
(
navController
.
currentDestination
?.
id
!=
R
.
id
.
homeFragment
)
{
navController
.
navigate
(
R
.
id
.
homeFragment
)
}
}
1
->
{
navController
.
navigate
(
R
.
id
.
playSlideFragment
)
}
2
->
{
navController
.
navigate
(
R
.
id
.
myListFragment
)
}
3
->
{
navController
.
navigate
(
R
.
id
.
rewardsFragment
)
}
4
->
{
navController
.
navigate
(
R
.
id
.
profileFragment
)
}
}
}
private
fun
showFragment
(
targetFragment
:
Fragment
)
{
val
transaction
=
supportFragmentManager
.
beginTransaction
()
// 隐藏所有Fragment
for
(
fragment
in
supportFragmentManager
.
fragments
)
{
transaction
.
hide
(
fragment
)
}
// 显示当前需要显示的Fragment
transaction
.
show
(
targetFragment
)
transaction
.
commit
()
}
fun
TabLayout
.
Tab
.
setUnselected
()
{
val
textView
=
customView
?.
findViewById
<
TextView
>(
R
.
id
.
tv_tab
)
...
...
@@ -132,7 +128,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
val
textView
=
customView
?.
findViewById
<
TextView
>(
R
.
id
.
tv_tab
)
LogEx
.
logDebug
(
TAG
,
"setSelected ${textView?.text}"
)
textView
?.
setTextColor
(
Color
.
parseColor
(
"#FFFFFF"
))
naviFragment
(
this
.
id
)
binding
.
viewPager2
.
setCurrentItem
(
this
.
id
,
false
)
}
override
fun
configSystemBar
()
{
...
...
app/src/main/java/com/base/appzxhy/ui/main/PlaySlideFragment.kt
View file @
55a87036
package
com.base.appzxhy.ui.main
import
android.view.View
import
androidx.fragment.app.Fragment
import
androidx.viewpager2.adapter.FragmentStateAdapter
import
androidx.viewpager2.widget.ViewPager2
import
com.base.appzxhy.base.BaseFragment
import
com.base.appzxhy.databinding.FragmentPlaySlideBinding
import
com.bytedance.sdk.shortplay.api.PSSDK
import
com.bytedance.sdk.shortplay.api.PSSDK.DetailPageConfig
import
com.bytedance.sdk.shortplay.api.PSSDK.FeedListLoadResult
import
com.bytedance.sdk.shortplay.api.PSSDK.FeedListResultListener
import
com.bytedance.sdk.shortplay.api.ShortPlay
import
com.bytedance.sdk.shortplay.api.ShortPlayFragment
class
PlaySlideFragment
:
BaseFragment
<
FragmentPlaySlideBinding
>(
FragmentPlaySlideBinding
::
inflate
)
{
private
var
feedListAdapter
:
FeedListAdapter
?
=
null
private
var
currentShortPlayFragment
:
ShortPlayFragment
?
=
null
override
fun
initView
()
{
super
.
initView
()
feedListAdapter
=
FeedListAdapter
(
this
)
binding
.
vpShortFeed
.
adapter
=
feedListAdapter
binding
.
vpShortFeed
.
setOrientation
(
ViewPager2
.
ORIENTATION_VERTICAL
)
binding
.
vpShortFeed
.
offscreenPageLimit
=
1
binding
.
vpShortFeed
.
registerOnPageChangeCallback
(
object
:
ViewPager2
.
OnPageChangeCallback
()
{
override
fun
onPageSelected
(
position
:
Int
)
{
//当前fragment
val
currentFragment
=
feedListAdapter
?.
getItem
(
position
)
if
(
currentFragment
is
ShortPlayFragment
)
{
currentShortPlayFragment
=
currentFragment
}
//预加载下个fragment
val
nextPos
=
position
+
1
val
nextPlayFragment
=
feedListAdapter
?.
getItem
(
nextPos
)
if
(
nextPlayFragment
is
ShortPlayFragment
)
{
nextPlayFragment
.
preLoadVideo
(
object
:
PSSDK
.
ActionResultListener
{
override
fun
onSuccess
()
{
}
override
fun
onFail
(
p0
:
PSSDK
.
ErrorInfo
?)
{
}
})
}
}
})
PSSDK
.
requestPopularDrama
(
1
,
20
,
object
:
FeedListResultListener
{
override
fun
onFail
(
errorInfo
:
PSSDK
.
ErrorInfo
?)
{
}
override
fun
onSuccess
(
result
:
FeedListLoadResult
<
ShortPlay
>?)
{
val
activity
=
requireActivity
()
as
MainActivity
?
result
?.
dataList
?.
let
{
activity
?.
runOnUiThread
{
setShortData
(
it
)
}
}
}
})
}
private
fun
setShortData
(
dataList
:
List
<
ShortPlay
>)
{
val
fragments
:
ArrayList
<
Fragment
>
=
ArrayList
()
dataList
.
forEach
{
shortPlay
->
val
shortPlayFragment
=
createShortPlayFragment
(
shortPlay
)
shortPlayFragment
?.
let
{
fragments
.
add
(
it
)
}
}
feedListAdapter
?.
appendData
(
fragments
)
}
private
fun
createShortPlayFragment
(
shortPlay
:
ShortPlay
):
ShortPlayFragment
?
{
val
builder
=
DetailPageConfig
.
Builder
()
builder
.
hideLeftTopCloseAndTitle
(
true
,
null
)
.
displayBottomExtraView
(
false
)
.
displayProgressBar
(
false
)
.
displayTextVisibility
(
DetailPageConfig
.
TEXT_POS_BOTTOM_TITLE
,
false
)
.
displayTextVisibility
(
DetailPageConfig
.
TEXT_POS_BOTTOM_DESC
,
false
)
.
playSingleItem
(
true
)
val
config
=
builder
.
build
()
val
shortPlayFragment
=
PSSDK
.
createDetailFragment
(
shortPlay
,
config
,
object
:
PSSDK
.
ShortPlayDetailPageListener
{
override
fun
onProgressChange
(
shortPlay
:
ShortPlay
,
index
:
Int
,
currentPlayTime
:
Int
,
duration
:
Int
)
=
Unit
override
fun
onPlayFailed
(
errorInfo
:
PSSDK
.
ErrorInfo
?):
Boolean
=
false
override
fun
onShortPlayPlayed
(
shortPlay
:
ShortPlay
?,
index
:
Int
)
=
Unit
override
fun
onItemSelected
(
position
:
Int
,
type
:
PSSDK
.
ShortPlayDetailPageListener
.
ItemType
,
index
:
Int
)
=
Unit
override
fun
onVideoPlayStateChanged
(
shortPlay
:
ShortPlay
?,
index
:
Int
,
playbackState
:
Int
)
=
Unit
override
fun
onVideoPlayCompleted
(
shortPlay
:
ShortPlay
?,
index
:
Int
)
=
Unit
override
fun
onEnterImmersiveMode
()
=
Unit
override
fun
onExitImmersiveMode
()
=
Unit
override
fun
isNeedBlock
(
shortPlay
:
ShortPlay
?,
index
:
Int
):
Boolean
=
false
override
fun
showAdIfNeed
(
shortPlay
:
ShortPlay
?,
index
:
Int
,
listener
:
PSSDK
.
ShortPlayBlockResultListener
?)
=
Unit
override
fun
onVideoInfoFetched
(
shortPlay
:
ShortPlay
?,
index
:
Int
,
videoPlayInfo
:
PSSDK
.
VideoPlayInfo
?)
=
Unit
override
fun
onObtainPlayerControlViews
():
MutableList
<
View
>
{
val
views
=
ArrayList
<
View
>()
return
views
}
})
return
shortPlayFragment
}
override
fun
initListener
()
{
super
.
initListener
()
}
inner
class
FeedListAdapter
(
fragment
:
Fragment
)
:
FragmentStateAdapter
(
fragment
)
{
private
val
fragments
:
ArrayList
<
Fragment
>
=
ArrayList
()
override
fun
getItemCount
():
Int
{
return
fragments
.
size
}
override
fun
createFragment
(
position
:
Int
):
Fragment
{
return
fragments
[
position
]
}
fun
appendData
(
fragments
:
List
<
Fragment
>)
{
val
size
=
this
.
fragments
.
size
this
.
fragments
.
addAll
(
fragments
)
notifyItemRangeInserted
(
size
,
fragments
.
size
)
}
fun
getItem
(
position
:
Int
):
Fragment
?
{
if
(
position
<
0
||
position
>=
fragments
.
size
)
{
return
null
}
return
fragments
[
position
]
}
}
override
fun
onResumeOneShoot
()
{
super
.
onResumeOneShoot
()
currentShortPlayFragment
?.
startPlay
()
}
override
fun
onPause
()
{
super
.
onPause
()
currentShortPlayFragment
?.
onPause
()
}
}
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/play/CustomOverlayView.kt
View file @
55a87036
package
com.base.appzxhy.ui.play
import
android.annotation.SuppressLint
import
android.app.Activity
import
android.content.Context
import
android.content.res.ColorStateList
import
android.graphics.Color
import
android.util.AttributeSet
import
android.util.SparseArray
import
android.widget.FrameLayout
import
android.widget.TextView
import
androidx.core.graphics.ColorUtils
...
...
@@ -15,8 +13,11 @@ import com.base.appzxhy.R
import
com.base.appzxhy.databinding.LayoutOverlayForyouBinding
import
com.base.appzxhy.databinding.LayoutOverlayPlayerBinding
import
com.base.appzxhy.ui.play.effect.AnimationEffect
import
com.base.appzxhy.ui.views.ShortPlayQualityDialog.showShortPlayQualityDialog
import
com.base.appzxhy.ui.views.ShortPlaySpeedDialog.showShortPlaySpeedDialog
import
com.base.appzxhy.utils.KotlinExt.formatSeconds
import
com.base.appzxhy.utils.LogEx
import
com.base.appzxhy.utils.ToastUtils.toast
import
com.base.appzxhy.utils.Utils.dp
import
com.bytedance.sdk.shortplay.api.PSSDK
import
com.bytedance.sdk.shortplay.api.ShortPlay
...
...
@@ -35,6 +36,7 @@ class CustomOverlayView : FrameLayout, PSSDK.IControlView {
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
)
{
...
...
@@ -101,6 +103,7 @@ class CustomOverlayView : FrameLayout, PSSDK.IControlView {
setThumbTintList
(
ColorStateList
.
valueOf
(
thumbColor
))
setThumbShadowColor
(
Color
.
BLACK
)
}
bindItemDataCallBack
?.
invoke
(
index
,
this
)
}
...
...
@@ -121,23 +124,6 @@ class CustomOverlayView : FrameLayout, PSSDK.IControlView {
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 @
55a87036
...
...
@@ -6,11 +6,17 @@ import android.util.SparseArray
import
android.view.Gravity
import
android.view.View
import
android.widget.FrameLayout
import
android.widget.TextView
import
androidx.activity.addCallback
import
com.base.appzxhy.R
import
com.base.appzxhy.base.BaseActivity
import
com.base.appzxhy.databinding.ActivityPlayFullBinding
import
com.base.appzxhy.databinding.LayoutOverlayPlayerBinding
import
com.base.appzxhy.ui.views.DialogSelectEP
import
com.base.appzxhy.ui.views.ShortPlayEPDialog.showShortPlayEPDialog
import
com.base.appzxhy.ui.views.ShortPlayQualityDialog.showShortPlayQualityDialog
import
com.base.appzxhy.ui.views.ShortPlaySpeedDialog.showShortPlaySpeedDialog
import
com.base.appzxhy.utils.KotlinExt.formatSeconds
import
com.base.appzxhy.utils.LogEx
import
com.base.appzxhy.utils.ToastUtils.toast
import
com.bytedance.sdk.shortplay.api.PSSDK
...
...
@@ -21,15 +27,19 @@ import com.bytedance.sdk.shortplay.api.ShortPlay
import
com.bytedance.sdk.shortplay.api.ShortPlayFragment
import
com.google.gson.Gson
import
com.gyf.immersionbar.ImmersionBar
import
com.
litao.slider.NiftySlider
import
com.
ss.ttvideoengine.Resolution
class
PlayFullActivity
:
BaseActivity
<
ActivityPlayFullBinding
>(
ActivityPlayFullBinding
::
inflate
)
{
private
var
shortPlay
:
ShortPlay
?
=
null
private
var
shortPlayFragment
:
ShortPlayFragment
?
=
null
private
var
startFromIndex
=
1
//剧集下标
private
val
startFromSeconds
=
0
//开始秒数
private
var
shortPlayFragment
:
ShortPlayFragment
?
=
null
private
var
playSpeed
=
1.0f
//0.5 0.75 1.0 1.25 1.5 2.0
private
var
resolutions
:
Array
<
Resolution
>?
=
null
private
var
currentResolution
=
Resolution
.
Auto
// private val playHistory: PlayHistoryHelper.PlayHistory = PlayHistoryHelper.PlayHistory()
private
val
playControlViewSparseArray
=
SparseArray
<
CustomOverlayView
>()
...
...
@@ -42,20 +52,19 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
shortPlay
=
Gson
().
fromJson
(
it
,
ShortPlay
::
class
.
java
)
}
shortPlay
?.
let
{
show
Detail
Fragment
(
it
)
}
shortPlay
?.
let
{
show
ShortPlayer
Fragment
(
it
)
}
shortPlay
?.
episodes
}
override
fun
initListener
()
{
super
.
initListener
()
onBackPressedDispatcher
.
addCallback
{
finish
()
}
}
/**
* 视频详情页
*/
private
fun
showDetailFragment
(
shortPlay
:
ShortPlay
)
{
private
fun
showShortPlayerFragment
(
shortPlay
:
ShortPlay
)
{
val
builder
=
DetailPageConfig
.
Builder
()
builder
.
displayTextVisibility
(
DetailPageConfig
.
TEXT_POS_BOTTOM_DESC
,
false
)
...
...
@@ -127,8 +136,12 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
}
override
fun
onShortPlayPlayed
(
shortPlay
:
ShortPlay
?,
index
:
Int
)
{
this
@PlayFullActivity
.
shortPlay
=
shortPlay
startFromIndex
=
index
LogEx
.
logDebug
(
TAG
,
"onShortPlayPlayed index=$index"
)
playControlViewSparseArray
.
get
(
index
)
?.
findViewById
<
TextView
>(
R
.
id
.
tvTitle
)
?.
text
=
"${shortPlay?.title} $index/${shortPlay?.total}"
// playHistory.shortPlay = shortPlay
// playHistory.index = index
// PlayHistoryHelper.savePlayHistory(playHistory)
...
...
@@ -164,6 +177,8 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
}
override
fun
onVideoInfoFetched
(
shortPlay
:
ShortPlay
?,
index
:
Int
,
videoPlayInfo
:
PSSDK
.
VideoPlayInfo
?)
{
// 每一集视频准备好时调用此方法告知本集的视频信息
resolutions
=
videoPlayInfo
?.
supportResolutions
}
@SuppressLint
(
"RtlHardcoded"
,
"SetTextI18n"
)
...
...
@@ -249,7 +264,8 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
playControlView
.
bindItemDataCallBack
=
{
index
,
view
->
playControlViewSparseArray
[
index
]
=
view
}
playControlView
.
bindProgressChange
(
shortPlayFragment
)
val
playerBinding
=
LayoutOverlayPlayerBinding
.
bind
(
playControlView
)
bindPlayControlView
(
playerBinding
)
return
views
}
})
...
...
@@ -267,6 +283,48 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
}
private
fun
bindPlayControlView
(
playerBinding
:
LayoutOverlayPlayerBinding
)
{
playerBinding
.
niftySlider
.
addOnValueChangeListener
{
slider
,
value
,
fromUser
->
if
(
fromUser
)
{
LogEx
.
logDebug
(
TAG
,
"value=$value"
)
shortPlayFragment
?.
setCurrentPlayTimeSeconds
(
value
.
toInt
())
playerBinding
.
tvPlayNow
.
text
=
value
.
toLong
().
formatSeconds
()
+
" / "
}
}
playerBinding
.
tvSpeed
.
setOnClickListener
{
showShortPlaySpeedDialog
(
playSpeed
)
{
newSpeed
->
if
(
playSpeed
!=
newSpeed
)
{
playSpeed
=
newSpeed
shortPlayFragment
?.
setVideoSpeed
(
newSpeed
)
playerBinding
.
tvSpeed
.
text
=
"${newSpeed}x"
}
}
}
playerBinding
.
tvQuality
.
setOnClickListener
{
if
(
resolutions
==
null
)
{
toast
(
"the video not support change resolution"
,
true
)
return
@setOnClickListener
}
else
{
resolutions
?.
let
{
showShortPlayQualityDialog
(
this
@PlayFullActivity
.
currentResolution
,
it
)
{
resolution
,
resolutionString
->
if
(
currentResolution
!=
resolution
)
{
currentResolution
=
resolution
shortPlayFragment
?.
setResolution
(
resolution
)
playerBinding
.
tvQuality
.
text
=
resolutionString
}
}
}
}
}
playerBinding
.
tvTitle
.
text
=
"${shortPlay?.title} $startFromIndex/${shortPlay?.total}"
playerBinding
.
flBack
.
setOnClickListener
{
onBackPressedDispatcher
.
onBackPressed
()
}
playerBinding
.
flMore
.
setOnClickListener
{
}
}
override
fun
configSystemBar
()
{
ImmersionBar
.
with
(
this
)
.
statusBarColor
(
R
.
color
.
black
)
...
...
app/src/main/java/com/base/appzxhy/ui/views/ShortPlayQualityDialog.kt
View file @
55a87036
...
...
@@ -4,11 +4,19 @@ import android.app.AlertDialog
import
android.content.Context
import
android.view.Gravity
import
android.view.LayoutInflater
import
android.view.View
import
androidx.core.content.ContextCompat
import
com.base.appzxhy.R
import
com.base.appzxhy.databinding.DialogPlayQualityBinding
import
com.ss.ttvideoengine.Resolution
object
ShortPlayQualityDialog
{
fun
Context
.
showShortPlayQualityDialog
()
{
fun
Context
.
showShortPlayQualityDialog
(
currentResolution
:
Resolution
,
resolutions
:
Array
<
Resolution
>,
resolutionAction
:
(
resolution
:
Resolution
,
resolutionString
:
String
)
->
Unit
)
{
val
dialog
=
AlertDialog
.
Builder
(
this
).
create
()
val
binding
=
DialogPlayQualityBinding
.
inflate
(
LayoutInflater
.
from
(
this
))
dialog
.
setView
(
binding
.
root
)
...
...
@@ -19,8 +27,66 @@ object ShortPlayQualityDialog {
val
params
=
dialog
.
window
?.
attributes
// params?.width = resources.getDimensionPixelOffset(R.dimen.dp_320)
// params?.height = resources.getDimensionPixelOffset(R.dimen.dp_400)
params
?.
gravity
=
Gravity
.
CENTER
// params?.y = 50
params
?.
gravity
=
Gravity
.
BOTTOM
params
?.
y
=
50
dialog
.
window
?.
attributes
=
params
dialog
.
window
?.
setBackgroundDrawableResource
(
android
.
R
.
color
.
transparent
)
resolutions
[
0
]
if
(
resolutions
.
contains
(
Resolution
.
High
))
{
binding
.
tvResolution1
.
text
=
"480P"
}
else
{
binding
.
tvResolution1
.
visibility
=
View
.
GONE
}
if
(
resolutions
.
contains
(
Resolution
.
SuperHigh
))
{
binding
.
tvResolution2
.
text
=
"720p"
}
else
{
binding
.
tvResolution2
.
visibility
=
View
.
GONE
}
if
(
resolutions
.
contains
(
Resolution
.
ExtremelyHigh
))
{
binding
.
tvResolution3
.
text
=
"1080P"
}
else
{
binding
.
tvResolution3
.
visibility
=
View
.
GONE
}
when
(
currentResolution
)
{
Resolution
.
Auto
->
{
binding
.
tvAuto
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
Resolution
.
High
->
{
binding
.
tvResolution1
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
Resolution
.
SuperHigh
->
{
binding
.
tvResolution2
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
Resolution
.
ExtremelyHigh
->
{
binding
.
tvResolution3
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
else
->
{}
}
binding
.
flClose
.
setOnClickListener
{
dialog
.
dismiss
()
}
binding
.
tvAuto
.
setOnClickListener
{
dialog
.
dismiss
()
resolutionAction
.
invoke
(
Resolution
.
Auto
,
"Auto"
)
}
binding
.
tvResolution1
.
setOnClickListener
{
dialog
.
dismiss
()
resolutionAction
.
invoke
(
Resolution
.
High
,
"480P"
)
}
binding
.
tvResolution2
.
setOnClickListener
{
dialog
.
dismiss
()
resolutionAction
.
invoke
(
Resolution
.
SuperHigh
,
"720P"
)
}
binding
.
tvResolution3
.
setOnClickListener
{
dialog
.
dismiss
()
resolutionAction
.
invoke
(
Resolution
.
ExtremelyHigh
,
"1080P"
)
}
}
}
\ No newline at end of file
app/src/main/java/com/base/appzxhy/ui/views/ShortPlaySpeedDialog.kt
View file @
55a87036
...
...
@@ -4,23 +4,79 @@ import android.app.AlertDialog
import
android.content.Context
import
android.view.Gravity
import
android.view.LayoutInflater
import
androidx.core.content.ContextCompat
import
com.base.appzxhy.R
import
com.base.appzxhy.databinding.DialogPlaySpeedBinding
object
ShortPlaySpeedDialog
{
fun
Context
.
showShortPlaySpeedDialog
()
{
fun
Context
.
showShortPlaySpeedDialog
(
speed
:
Float
,
selectSpeedAction
:
(
speed
:
Float
)
->
Unit
)
{
val
dialog
=
AlertDialog
.
Builder
(
this
).
create
()
val
binding
=
DialogPlaySpeedBinding
.
inflate
(
LayoutInflater
.
from
(
this
))
dialog
.
setView
(
binding
.
root
)
dialog
.
setCanceledOnTouchOutside
(
fals
e
)
dialog
.
setCanceledOnTouchOutside
(
tru
e
)
dialog
.
show
()
val
params
=
dialog
.
window
?.
attributes
// params?.width = resources.getDimensionPixelOffset(R.dimen.dp_320)
// params?.height = resources.getDimensionPixelOffset(R.dimen.dp_400)
params
?.
gravity
=
Gravity
.
CENTER
// params?.y = 50
params
?.
gravity
=
Gravity
.
BOTTOM
params
?.
y
=
50
dialog
.
window
?.
attributes
=
params
dialog
.
window
?.
setBackgroundDrawableResource
(
android
.
R
.
color
.
transparent
)
when
(
speed
)
{
0.5f
->
{
binding
.
tv05
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
0.75f
->
{
binding
.
tv075
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
1.0f
->
{
binding
.
tv1
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
1.25f
->
{
binding
.
tv125
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
1.5f
->
{
binding
.
tv15
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
2.0f
->
{
binding
.
tv2
.
background
=
ContextCompat
.
getDrawable
(
this
,
R
.
drawable
.
bg_stroke_33ffffff_4dff3d71_5
)
}
}
binding
.
tv05
.
setOnClickListener
{
dialog
.
dismiss
()
selectSpeedAction
.
invoke
(
0.5f
)
}
binding
.
tv075
.
setOnClickListener
{
dialog
.
dismiss
()
selectSpeedAction
.
invoke
(
0.75f
)
}
binding
.
tv1
.
setOnClickListener
{
dialog
.
dismiss
()
selectSpeedAction
.
invoke
(
1.0f
)
}
binding
.
tv125
.
setOnClickListener
{
dialog
.
dismiss
()
selectSpeedAction
.
invoke
(
1.25f
)
}
binding
.
tv15
.
setOnClickListener
{
dialog
.
dismiss
()
selectSpeedAction
.
invoke
(
1.5f
)
}
binding
.
tv2
.
setOnClickListener
{
dialog
.
dismiss
()
selectSpeedAction
.
invoke
(
2.0f
)
}
binding
.
flClose
.
setOnClickListener
{
dialog
.
dismiss
()
}
}
}
\ No newline at end of file
app/src/main/res/drawable/bg_2d2f3d_10.xml
0 → 100644
View file @
55a87036
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<solid
android:color=
"#2D2F3D"
/>
<corners
android:radius=
"10dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_stroke_33ffffff_4d030303_5.xml
0 → 100644
View file @
55a87036
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<stroke
android:width=
"1dp"
android:color=
"#33ffffff"
/>
<solid
android:color=
"#4d030303"
/>
<corners
android:radius=
"5dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_stroke_33ffffff_4dff3d71_5.xml
0 → 100644
View file @
55a87036
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<stroke
android:width=
"1dp"
android:color=
"#33ffffff"
/>
<solid
android:color=
"#4dff3d71"
/>
<corners
android:radius=
"5dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/layout/activity_main.xml
View file @
55a87036
...
...
@@ -6,9 +6,8 @@
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<androidx.fragment.app.FragmentContainerView
android:id=
"@+id/fragment_container"
android:name=
"androidx.navigation.fragment.NavHostFragment"
<androidx.viewpager2.widget.ViewPager2
android:id=
"@+id/viewPager2"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
app:layout_constraintBottom_toTopOf=
"@id/fl_tab"
...
...
app/src/main/res/layout/dialog_play_quality.xml
View file @
55a87036
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
android:layout_height=
"wrap_content"
android:background=
"@drawable/bg_2d2f3d_10"
>
<TextView
android:id=
"@+id/tv"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"14dp"
android:layout_marginTop=
"10dp"
android:text=
"@string/quality"
android:textColor=
"@color/white"
android:textSize=
"16sp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
<FrameLayout
android:id=
"@+id/flClose"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:padding=
"15dp"
app:layout_constraintBottom_toBottomOf=
"@id/tv"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"@id/tv"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/guanbi"
/>
</FrameLayout>
<LinearLayout
android:id=
"@+id/ll1"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"10dp"
android:layout_marginTop=
"18dp"
app:layout_constraintTop_toBottomOf=
"@id/tv"
>
<TextView
android:id=
"@+id/tvAuto"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"Auto"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:id=
"@+id/tvResolution1"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:id=
"@+id/tvResolution2"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:id=
"@+id/tvResolution3"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
</LinearLayout>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"8dp"
android:layout_marginBottom=
"16dp"
android:text=
"Auto-switch to optimal resolution"
android:textColor=
"@color/white"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/ll1"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/dialog_play_speed.xml
View file @
55a87036
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
android:layout_height=
"wrap_content"
android:background=
"@drawable/bg_2d2f3d_10"
>
<TextView
android:id=
"@+id/tv"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"14dp"
android:layout_marginTop=
"10dp"
android:text=
"@string/playback_speed"
android:textColor=
"@color/white"
android:textSize=
"16sp"
app:layout_constraintStart_toStartOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
/>
<FrameLayout
android:id=
"@+id/flClose"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:padding=
"15dp"
app:layout_constraintBottom_toBottomOf=
"@id/tv"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintTop_toTopOf=
"@id/tv"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/guanbi"
/>
</FrameLayout>
<LinearLayout
android:id=
"@+id/ll1"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"10dp"
android:layout_marginTop=
"18dp"
app:layout_constraintTop_toBottomOf=
"@id/tv"
>
<TextView
android:id=
"@+id/tv_0_5"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"0.5x"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:id=
"@+id/tv_0_7_5"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"0.75x"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:id=
"@+id/tv_1"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"1.0x"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:id=
"@+id/tv_1_25"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"1.25x"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
</LinearLayout>
<LinearLayout
android:id=
"@+id/ll2"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"10dp"
android:layout_marginBottom=
"12dp"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintTop_toBottomOf=
"@id/ll1"
>
<TextView
android:id=
"@+id/tv_1_5"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"1.5x"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:id=
"@+id/tv_2"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"2.0x"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:visibility=
"invisible"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"2.0x"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
<TextView
android:visibility=
"invisible"
android:layout_width=
"0dp"
android:layout_height=
"52dp"
android:layout_margin=
"6dp"
android:layout_weight=
"1"
android:background=
"@drawable/bg_stroke_33ffffff_4d030303_5"
android:gravity=
"center"
android:text=
"2.0x"
android:textColor=
"@color/white"
android:textSize=
"16sp"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_play_slide.xml
View file @
55a87036
...
...
@@ -6,5 +6,9 @@
tools:context=
".ui.main.PlaySlideFragment"
>
<androidx.viewpager2.widget.ViewPager2
android:id=
"@+id/vpShortFeed"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
/>
</FrameLayout>
\ No newline at end of file
app/src/main/res/layout/layout_overlay_player.xml
View file @
55a87036
...
...
@@ -6,6 +6,53 @@
android:layout_height=
"match_parent"
tools:background=
"#99000000"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"top"
android:layout_marginTop=
"60dp"
android:orientation=
"horizontal"
>
<FrameLayout
android:id=
"@+id/flBack"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:padding=
"16dp"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/fanhui"
/>
</FrameLayout>
<TextView
android:id=
"@+id/tvTitle"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_weight=
"1"
android:ellipsize=
"end"
android:singleLine=
"true"
android:textColor=
"@color/white"
android:textSize=
"16sp"
android:textStyle=
"bold"
tools:text=
"Secret Strangers in Love"
/>
<FrameLayout
android:id=
"@+id/flMore"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:padding=
"16dp"
>
<ImageView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:src=
"@mipmap/genduo"
/>
</FrameLayout>
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width=
"match_parent"
...
...
@@ -38,22 +85,22 @@
android:layout_height=
"wrap_content"
android:layout_marginTop=
"8dp"
android:layout_marginBottom=
"8dp"
android:text=
"00:00 / "
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 / "
/>
app:layout_constraintTop_toBottomOf=
"@id/nifty_slider"
/>
<TextView
android:id=
"@+id/tvPlayTotal"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"00:00"
android:textColor=
"#80FFFFFF"
android:textSize=
"13sp"
app:layout_constraintStart_toEndOf=
"@id/tvPlayNow"
app:layout_constraintTop_toTopOf=
"@id/tvPlayNow"
android:text=
"00:00"
/>
app:layout_constraintTop_toTopOf=
"@id/tvPlayNow"
/>
<TextView
android:id=
"@+id/tvQuality"
...
...
@@ -82,5 +129,4 @@
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
\ No newline at end of file
app/src/main/res/mipmap-xxhdpi/genduo.png
0 → 100644
View file @
55a87036
426 Bytes
app/src/main/res/mipmap-xxhdpi/guanbi.png
0 → 100644
View file @
55a87036
548 Bytes
app/src/main/res/values/strings.xml
View file @
55a87036
...
...
@@ -31,5 +31,7 @@
<string
name=
"discover_more"
>
Discover More
</string>
<string
name=
"nothing_here_yet_add_something"
>
Nothing here yet - Add something!
</string>
<string
name=
"auto"
>
Auto
</string>
<string
name=
"playback_speed"
>
Playback Speed
</string>
<string
name=
"quality"
>
Quality
</string>
</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