Commit f152a0f0 authored by wanglei's avatar wanglei

...

parent 118a34f7
......@@ -2,7 +2,6 @@ package com.base.appzxhy.ui.main
import android.content.Intent
import androidx.core.view.updatePadding
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.RecyclerView
......@@ -52,6 +51,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
})
}
private val categories = arrayListOf<Long>()
private fun initCategoryAdapter() {
val activity = requireActivity() as MainActivity?
lifecycleScope.launch {
......@@ -61,13 +61,16 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
kotlin.runCatching {
ids = list[0].categories[0].id
}
val categoryTitle = activity.viewModel.categoryTitle(requireContext(), ids)
val categoryAdapter = ShortPlayCategoryAdapter(categoryTitle, list)
categoryAdapter.itemClick = ::shortPlayClick
categoryAdapter.categoryClick = {
jumpCategory(ids)
if (!categories.contains(ids)) {
categories.add(ids)
val categoryTitle = activity.viewModel.categoryTitle(requireContext(), ids)
val categoryAdapter = ShortPlayCategoryAdapter(categoryTitle, list)
categoryAdapter.itemClick = ::shortPlayClick
categoryAdapter.categoryClick = {
jumpCategory(ids)
}
contactAdapter?.addAdapter(categoryAdapter)
}
contactAdapter?.addAdapter(categoryAdapter)
}
}
}
......
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
import androidx.interpolator.view.animation.FastOutLinearInInterpolator
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.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.ShortPlay
import com.bytedance.sdk.shortplay.api.ShortPlayFragment
import com.litao.slider.NiftySlider
/**
* 自定义播放页面悬浮成
*/
class CustomOverlayView : FrameLayout, PSSDK.IControlView {
private val TAG = "CustomOverlayView"
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) {
this.layout = layout
......@@ -37,8 +58,86 @@ class CustomOverlayView : FrameLayout, PSSDK.IControlView {
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
import android.annotation.SuppressLint
import android.content.Intent
import android.util.SparseArray
import android.view.Gravity
import android.view.View
import android.widget.FrameLayout
import com.base.appzxhy.R
import com.base.appzxhy.base.BaseActivity
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.ShortPlayEPDialog.showShortPlayEPDialog
import com.base.appzxhy.utils.LogEx
......@@ -21,17 +21,18 @@ 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
class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullBinding::inflate) {
private var shortPlay: ShortPlay? = null
private var detailFragment: ShortPlayFragment? = null
private var shortPlayFragment: ShortPlayFragment? = null
private var startFromIndex = 1//剧集下标
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() {
super.initView()
......@@ -43,6 +44,7 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
shortPlay?.let { showDetailFragment(it) }
shortPlay?.episodes
}
override fun initListener() {
......@@ -93,14 +95,23 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
}
})
builder.progressBarMarginToBottom(10)
builder.enableImmersiveMode(5000)
builder.enableAutoPlayNext(true)
builder.enableAutoPlayNext(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) {
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 {
......@@ -116,9 +127,11 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
}
override fun onShortPlayPlayed(shortPlay: ShortPlay?, index: Int) {
playHistory.shortPlay = shortPlay
playHistory.index = index
PlayHistoryHelper.savePlayHistory(playHistory)
startFromIndex = index
LogEx.logDebug(TAG, "onShortPlayPlayed index=$index")
// playHistory.shortPlay = shortPlay
// playHistory.index = index
// PlayHistoryHelper.savePlayHistory(playHistory)
}
override fun onItemSelected(position: Int, p1: PSSDK.ShortPlayDetailPageListener.ItemType?, index: Int) {
......@@ -153,7 +166,7 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
override fun onVideoInfoFetched(shortPlay: ShortPlay?, index: Int, videoPlayInfo: PSSDK.VideoPlayInfo?) {
}
@SuppressLint("RtlHardcoded")
@SuppressLint("RtlHardcoded", "SetTextI18n")
override fun onObtainPlayerControlViews(): MutableList<View> {
val views = java.util.ArrayList<View>()
......@@ -194,16 +207,16 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
customPEView.setLayoutParams(peParams)
views.add(customPEView)
customPEView.setOnClickListener {
detailFragment?.pausePlay()
shortPlayFragment?.pausePlay()
showShortPlayEPDialog(shortPlay.total, startFromIndex, 5, object : DialogSelectEP {
override fun dismissAction() {
detailFragment?.startPlay()
shortPlayFragment?.startPlay()
}
override fun selectEPAction(ep: Int) {
super.selectEPAction(ep)
startFromIndex = ep
detailFragment?.startPlayIndex(startFromIndex)
shortPlayFragment?.startPlayIndex(startFromIndex)
}
})
}
......@@ -231,17 +244,21 @@ class PlayFullActivity : BaseActivity<ActivityPlayFullBinding>(ActivityPlayFullB
val playControlView = CustomOverlayView(this@PlayFullActivity, R.layout.layout_overlay_player)
playControlView.layoutParams =
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
}
})
if (detailFragment == null) {
if (shortPlayFragment == null) {
LogEx.logDebug(TAG, "create detailFragment failed")
return
}
detailFragment?.let {
shortPlayFragment?.let {
// 将播放页展示出来
supportFragmentManager.beginTransaction()
.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() {
addAll(tempCategoryList)
}
/**
* 按分类顺序获取列表
*/
fun getCategoryListFlow(
reload: Boolean = false,
count: Int = 12,
......
package com.base.appzxhy.utils
import android.annotation.SuppressLint
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale
import java.util.concurrent.TimeUnit
import kotlin.time.Duration
import kotlin.time.toDuration
object KotlinExt {
......@@ -49,6 +53,18 @@ object KotlinExt {
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 {
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 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="60dp">
android:background="@color/black">
<!-- <TextView-->
<!-- android:id="@+id/tvPlaySecond"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content" />-->
<com.litao.slider.NiftySlider
android:id="@+id/nifty_slider"
android:layout_width="match_parent"
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>
......
......@@ -30,5 +30,6 @@
<string name="list">List</string>
<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>
</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