From 18ce8f1fc2a6dfd90fd4bb053f1fee3a52ea6c43 Mon Sep 17 00:00:00 2001
From: SkyD666 <1161046314@qq.com>
Date: Mon, 4 Oct 2021 16:47:23 +0800
Subject: [PATCH] =?UTF-8?q?[optimize|fix]=E4=BF=AE=E5=A4=8D=E5=B1=8F?=
=?UTF-8?q?=E5=B9=95=E6=97=8B=E8=BD=AC=E5=90=8E=E9=83=A8=E5=88=86=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=E5=AD=98=E5=9C=A8=E7=9A=84=E6=9F=90=E4=BA=9B=E9=97=AE?=
=?UTF-8?q?=E9=A2=98=EF=BC=9B=E5=AF=B9=E5=AE=BD=E5=B1=8F=E8=AE=BE=E5=A4=87?=
=?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BA=86=E4=B8=80=E5=AE=9A=E7=9A=84=E9=80=82?=
=?UTF-8?q?=E9=85=8D=EF=BC=9B=E4=BC=98=E5=8C=96=E6=92=AD=E6=94=BE=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=E5=B8=83=E5=B1=80=E9=80=BB=E8=BE=91=EF=BC=9B=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0ContentScrimAttr=E6=8D=A2=E8=82=A4=E5=B1=9E=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 34 +--
.../main/java/com/skyd/imomoe/util/View.kt | 10 +-
.../skyd/imomoe/view/activity/BaseActivity.kt | 1 -
.../skyd/imomoe/view/activity/PlayActivity.kt | 259 +++++++++++++-----
.../skyd/imomoe/view/adapter/PlayAdapter.kt | 2 +-
.../component/SmartScrollingFooterBehavior.kt | 38 +++
.../component/player/AnimeOrientationUtils.kt | 61 +++++
.../view/component/player/AnimeVideoPlayer.kt | 63 ++++-
.../player/DetailPlayerActivity.java | 55 ++--
.../component/player/MyVideoAllCallBack.kt | 11 +
.../skyd/imomoe/view/fragment/HomeFragment.kt | 4 +-
.../res/layout-sw600dp-land/activity_play.xml | 109 ++++++++
.../res/layout-sw600dp-port/activity_play.xml | 168 ++++++++++++
app/src/main/res/layout/activity_play.xml | 217 ++++++++++-----
.../main/res/layout/item_anime_cover_1.xml | 7 +-
.../main/res/layout/item_anime_cover_4.xml | 20 +-
.../main/res/layout/item_anime_cover_6.xml | 2 +-
.../main/res/layout/item_anime_cover_8.xml | 5 +-
app/src/main/res/layout/item_banner_1.xml | 26 +-
app/src/main/res/layout/item_header_1.xml | 2 +-
app/src/main/res/layout/item_skin_cover_1.xml | 3 +-
app/src/main/res/values/strings.xml | 3 +
.../main/java/com/skyd/skin/SkinManager.kt | 7 +-
.../skyd/skin/core/attrs/ContentScrimAttr.kt | 33 +++
24 files changed, 936 insertions(+), 204 deletions(-)
create mode 100644 app/src/main/java/com/skyd/imomoe/view/component/SmartScrollingFooterBehavior.kt
create mode 100644 app/src/main/java/com/skyd/imomoe/view/component/player/AnimeOrientationUtils.kt
create mode 100644 app/src/main/java/com/skyd/imomoe/view/component/player/MyVideoAllCallBack.kt
create mode 100644 app/src/main/res/layout-sw600dp-land/activity_play.xml
create mode 100644 app/src/main/res/layout-sw600dp-port/activity_play.xml
create mode 100644 skin/src/main/java/com/skyd/skin/core/attrs/ContentScrimAttr.kt
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7f8ffc88..c09ae051 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -36,64 +36,64 @@
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
+ android:configChanges="uiMode|orientation|keyboardHidden|screenSize" />
diff --git a/app/src/main/java/com/skyd/imomoe/util/View.kt b/app/src/main/java/com/skyd/imomoe/util/View.kt
index 878f2d2e..3901ada0 100644
--- a/app/src/main/java/com/skyd/imomoe/util/View.kt
+++ b/app/src/main/java/com/skyd/imomoe/util/View.kt
@@ -1,18 +1,22 @@
package com.skyd.imomoe.util
import android.view.View
+import android.view.animation.AlphaAnimation
-fun View.gone() {
+fun View.gone(animate: Boolean = false, dur: Long = 500L) {
+ if (animate) startAnimation(AlphaAnimation(1f, 0f).apply { duration = dur })
visibility = View.GONE
}
-fun View.visible() {
+fun View.visible(animate: Boolean = false, dur: Long = 500L) {
visibility = View.VISIBLE
+ if (animate) startAnimation(AlphaAnimation(0f, 1f).apply { duration = dur })
}
-fun View.invisible() {
+fun View.invisible(animate: Boolean = false, dur: Long = 500L) {
visibility = View.INVISIBLE
+ if (animate) startAnimation(AlphaAnimation(0f, 1f).apply { duration = dur })
}
fun View.clickScale(scale: Float = 0.75f, duration: Long = 100) {
diff --git a/app/src/main/java/com/skyd/imomoe/view/activity/BaseActivity.kt b/app/src/main/java/com/skyd/imomoe/view/activity/BaseActivity.kt
index e3756f1e..cb2d2a5f 100644
--- a/app/src/main/java/com/skyd/imomoe/view/activity/BaseActivity.kt
+++ b/app/src/main/java/com/skyd/imomoe/view/activity/BaseActivity.kt
@@ -1,6 +1,5 @@
package com.skyd.imomoe.view.activity
-import android.content.res.Resources
import android.os.Bundle
import android.util.Log
import android.view.View
diff --git a/app/src/main/java/com/skyd/imomoe/view/activity/PlayActivity.kt b/app/src/main/java/com/skyd/imomoe/view/activity/PlayActivity.kt
index 4a91a6f3..4a3cf3f4 100644
--- a/app/src/main/java/com/skyd/imomoe/view/activity/PlayActivity.kt
+++ b/app/src/main/java/com/skyd/imomoe/view/activity/PlayActivity.kt
@@ -1,5 +1,6 @@
package com.skyd.imomoe.view.activity
+import android.animation.ValueAnimator
import android.app.Dialog
import android.content.Intent
import android.content.res.Configuration
@@ -7,12 +8,21 @@ import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
+import android.widget.ImageView
import android.widget.TextView
+import androidx.appcompat.widget.Toolbar
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.coordinatorlayout.widget.CoordinatorLayout
+import androidx.core.view.ViewCompat
+import androidx.core.widget.NestedScrollView
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+import com.google.android.material.appbar.AppBarLayout
+import com.google.android.material.appbar.CollapsingToolbarLayout
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.shuyu.gsyvideoplayer.GSYVideoManager
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder
@@ -20,6 +30,7 @@ import com.shuyu.gsyvideoplayer.model.VideoOptionModel
import com.shuyu.gsyvideoplayer.player.PlayerFactory
import com.shuyu.gsyvideoplayer.utils.GSYVideoType
import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer
+import com.shuyu.gsyvideoplayer.video.base.GSYVideoView.CURRENT_STATE_AUTO_COMPLETE
import com.skyd.imomoe.App
import com.skyd.imomoe.R
import com.skyd.imomoe.bean.AnimeEpisodeDataBean
@@ -27,12 +38,10 @@ import com.skyd.imomoe.bean.FavoriteAnimeBean
import com.skyd.imomoe.config.Api
import com.skyd.imomoe.config.Const
import com.skyd.imomoe.database.getAppDataBase
-import com.skyd.imomoe.databinding.ActivityPlayBinding
import com.skyd.imomoe.model.DataSourceManager
import com.skyd.imomoe.util.AnimeEpisode2ViewHolder
import com.skyd.imomoe.util.MD5.getMD5
import com.skyd.imomoe.util.Util.dp
-import com.skyd.imomoe.util.html.SnifferVideo
import com.skyd.imomoe.util.Util.getDetailLinkByEpisodeLink
import com.skyd.imomoe.util.Util.getResColor
import com.skyd.imomoe.util.Util.getResDrawable
@@ -42,6 +51,8 @@ import com.skyd.imomoe.util.Util.setColorStatusBar
import com.skyd.imomoe.util.Util.showToast
import com.skyd.imomoe.util.downloadanime.AnimeDownloadHelper
import com.skyd.imomoe.util.gone
+import com.skyd.imomoe.util.html.SnifferVideo
+import com.skyd.imomoe.util.visible
import com.skyd.imomoe.view.adapter.AnimeDetailAdapter
import com.skyd.imomoe.view.adapter.PlayAdapter
import com.skyd.imomoe.view.adapter.decoration.AnimeEpisodeItemDecoration
@@ -50,22 +61,23 @@ import com.skyd.imomoe.view.adapter.spansize.PlaySpanSize
import com.skyd.imomoe.view.component.player.AnimeVideoPlayer
import com.skyd.imomoe.view.component.player.DanmakuVideoPlayer
import com.skyd.imomoe.view.component.player.DetailPlayerActivity
+import com.skyd.imomoe.view.component.textview.TypefaceTextView
import com.skyd.imomoe.view.fragment.MoreDialogFragment
import com.skyd.imomoe.view.fragment.ShareDialogFragment
import com.skyd.imomoe.viewmodel.PlayViewModel
import kotlinx.coroutines.*
import tv.danmaku.ijk.media.exo2.Exo2PlayerManager
import tv.danmaku.ijk.media.player.IjkMediaPlayer
+import kotlin.math.abs
class PlayActivity : DetailPlayerActivity() {
override var statusBarSkin: Boolean = false
- private lateinit var mBinding: ActivityPlayBinding
private var isFavorite: Boolean = false
private var favoriteBeanDataReady: Int = 0
set(value) {
field = value
- if (value == 2) mBinding.ivPlayActivityFavorite.isEnabled = true
+ if (value == 2) ivPlayActivityFavorite.isEnabled = true
}
private var partUrl: String = ""
private var detailPartUrl: String = ""
@@ -75,11 +87,71 @@ class PlayActivity : DetailPlayerActivity() {
private var danmuUrl: String = ""
private var danmuParamMap: HashMap = HashMap()
private var currentNightMode: Int = 0
+ private var lastCanCollapsed: Boolean? = null
+
+ private lateinit var ivPlayActivityFavorite: ImageView
+ private lateinit var avpPlayActivity: DanmakuVideoPlayer
+ private var ivPlayActivityToolbarMore: ImageView? = null
+ private lateinit var rvPlayActivity: RecyclerView
+ private lateinit var srlPlayActivity: SwipeRefreshLayout
+ private lateinit var tvPlayActivityTitle: TypefaceTextView
+ private var nsvPlayActivity: NestedScrollView? = null
+ private var tvPlayActivityToolbarTitle: TextView? = null
+ private var ablPlayActivity: AppBarLayout? = null
+
+ private fun initView() {
+ ivPlayActivityFavorite = findViewById(R.id.iv_play_activity_favorite)
+ ivPlayActivityToolbarMore = findViewById(R.id.iv_play_activity_toolbar_more)
+ rvPlayActivity = findViewById(R.id.rv_play_activity)
+ srlPlayActivity = findViewById(R.id.srl_play_activity)
+ tvPlayActivityTitle = findViewById(R.id.tv_play_activity_title)
+ nsvPlayActivity = findViewById(R.id.nsv_play_activity)
+ tvPlayActivityToolbarTitle = findViewById(R.id.tv_play_activity_toolbar_title)
+ ablPlayActivity = findViewById(R.id.abl_play_activity)
+ avpPlayActivity = findViewById(R.id.avp_play_activity)
+
+ val tbPlayActivity: Toolbar? = findViewById(R.id.tb_play_activity)
+ val ctlPlayActivity: CollapsingToolbarLayout? = findViewById(R.id.ctl_play_activity)
+ val clPlayActivityToolbarLayout: ConstraintLayout? =
+ findViewById(R.id.cl_play_activity_toolbar_layout)
+ val ivPlayActivityToolbarBack: ImageView? = findViewById(R.id.iv_play_activity_toolbar_back)
+
+ if (tbPlayActivity != null && ctlPlayActivity != null &&
+ clPlayActivityToolbarLayout != null && ivPlayActivityToolbarBack != null &&
+ tvPlayActivityToolbarTitle != null
+ ) {
+ setSupportActionBar(tbPlayActivity)
+ supportActionBar?.setDisplayShowTitleEnabled(false)
+
+ ablPlayActivity?.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset ->
+ when {
+ abs(verticalOffset) > ctlPlayActivity.scrimVisibleHeightTrigger -> {
+ if (tbPlayActivity.visibility != View.VISIBLE) {
+ clPlayActivityToolbarLayout.visible()
+ tbPlayActivity.visible()
+ }
+ }
+ else -> {
+ if (tbPlayActivity.visibility != View.GONE) {
+ clPlayActivityToolbarLayout.gone()
+ tbPlayActivity.gone(true, 600)
+ }
+ }
+ }
+ })
+
+ ivPlayActivityToolbarBack.setOnClickListener { finish() }
+ tvPlayActivityToolbarTitle?.setOnClickListener {
+ (avpPlayActivity.currentPlayer as AnimeVideoPlayer).clickStartIcon()
+ }
+ }
+ }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- mBinding = ActivityPlayBinding.inflate(layoutInflater)
- setContentView(mBinding.root)
+ setContentView(R.layout.activity_play)
+
+ initView()
currentNightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
@@ -91,7 +163,7 @@ class PlayActivity : DetailPlayerActivity() {
initVideoBuilderMode()
- mBinding.avpPlayActivity.run {
+ avpPlayActivity.run {
getDownloadButton()?.setOnClickListener { getSheetDialog("download").show() }
// 设置返回按键功能
backButton?.setOnClickListener { onBackPressed() }
@@ -105,67 +177,67 @@ class PlayActivity : DetailPlayerActivity() {
if (detailPartUrl.isBlank() || detailPartUrl == const.actionUrl.ANIME_DETAIL())
detailPartUrl = getDetailLinkByEpisodeLink(partUrl)
- mBinding.avpPlayActivity.let { player ->
- // 分享按钮
- player.getShareButton()?.setOnClickListener {
- ShareDialogFragment().setShareContent(Api.MAIN_URL + viewModel.partUrl)
- .show(supportFragmentManager, "share_dialog")
- }
- // 更多按钮
- player.getMoreButton()?.setOnClickListener {
- MoreDialogFragment().run {
- setOnClickListener(
- arrayOf(View.OnClickListener { dismiss() },
- View.OnClickListener {
- startActivity(
- Intent(this@PlayActivity, DlnaActivity::class.java)
- .putExtra("url", player.getUrl())
- .putExtra("title", player.getTitle())
+
+ // 分享按钮
+ avpPlayActivity.getShareButton()?.setOnClickListener {
+ ShareDialogFragment().setShareContent(Api.MAIN_URL + viewModel.partUrl)
+ .show(supportFragmentManager, "share_dialog")
+ }
+ // 更多按钮
+ View.OnClickListener {
+ MoreDialogFragment().run {
+ setOnClickListener(
+ arrayOf(View.OnClickListener { dismiss() },
+ View.OnClickListener {
+ startActivity(
+ Intent(this@PlayActivity, DlnaActivity::class.java)
+ .putExtra("url", avpPlayActivity.getUrl())
+ .putExtra("title", avpPlayActivity.getTitle())
+ )
+ dismiss()
+ }, View.OnClickListener {
+ if (!openVideoByExternalPlayer(
+ this@PlayActivity,
+ viewModel.animeEpisodeDataBean.videoUrl
)
- dismiss()
- }, View.OnClickListener {
- if (!openVideoByExternalPlayer(
- this@PlayActivity,
- viewModel.animeEpisodeDataBean.videoUrl
- )
- ) getString(R.string.matched_app_not_found).showToast()
- dismiss()
- })
- )
- show(supportFragmentManager, "more_dialog")
- }
+ ) getString(R.string.matched_app_not_found).showToast()
+ dismiss()
+ })
+ )
+ show(supportFragmentManager, "more_dialog")
}
+ }.let {
+ avpPlayActivity.getMoreButton()?.setOnClickListener(it)
+ ivPlayActivityToolbarMore?.setOnClickListener(it)
}
- mBinding.run {
- rvPlayActivity.layoutManager = GridLayoutManager(this@PlayActivity, 4)
- .apply { spanSizeLookup = PlaySpanSize(adapter) }
- // 复用AnimeShow的ItemDecoration
- rvPlayActivity.addItemDecoration(AnimeShowItemDecoration())
- rvPlayActivity.setHasFixedSize(true)
- rvPlayActivity.adapter = adapter
+ rvPlayActivity.layoutManager = GridLayoutManager(this@PlayActivity, 4)
+ .apply { spanSizeLookup = PlaySpanSize(adapter) }
+ // 复用AnimeShow的ItemDecoration
+ rvPlayActivity.addItemDecoration(AnimeShowItemDecoration())
+ rvPlayActivity.setHasFixedSize(true)
+ rvPlayActivity.adapter = adapter
- srlPlayActivity.setOnRefreshListener { viewModel.getPlayData(partUrl) }
- srlPlayActivity.setColorSchemeResources(getSkinResourceId(R.color.main_color_skin))
- }
+ srlPlayActivity.setOnRefreshListener { viewModel.getPlayData(partUrl) }
+ srlPlayActivity.setColorSchemeResources(getSkinResourceId(R.color.main_color_skin))
lifecycleScope.launch(Dispatchers.IO) {
val favoriteAnime = getAppDataBase().favoriteAnimeDao().getFavoriteAnime(detailPartUrl)
runOnUiThread {
isFavorite = if (favoriteAnime == null) {
- mBinding.ivPlayActivityFavorite.setImageDrawable(getResDrawable(R.drawable.ic_star_border_main_color_2_24_skin))
+ ivPlayActivityFavorite.setImageDrawable(getResDrawable(R.drawable.ic_star_border_main_color_2_24_skin))
false
} else {
- mBinding.ivPlayActivityFavorite.setImageDrawable(getResDrawable(R.drawable.ic_star_main_color_2_24_skin))
+ ivPlayActivityFavorite.setImageDrawable(getResDrawable(R.drawable.ic_star_main_color_2_24_skin))
true
}
- mBinding.ivPlayActivityFavorite.setOnClickListener {
+ ivPlayActivityFavorite.setOnClickListener {
if (isFavorite) {
Thread {
getAppDataBase().favoriteAnimeDao().deleteFavoriteAnime(detailPartUrl)
}.start()
isFavorite = false
- mBinding.ivPlayActivityFavorite.setImageDrawable(getResDrawable(R.drawable.ic_star_border_main_color_2_24_skin))
+ ivPlayActivityFavorite.setImageDrawable(getResDrawable(R.drawable.ic_star_border_main_color_2_24_skin))
getString(R.string.remove_favorite_succeed).showToast()
} else {
Thread {
@@ -182,13 +254,13 @@ class PlayActivity : DetailPlayerActivity() {
)
}.start()
isFavorite = true
- mBinding.ivPlayActivityFavorite.setImageDrawable(getResDrawable(R.drawable.ic_star_main_color_2_24_skin))
+ ivPlayActivityFavorite.setImageDrawable(getResDrawable(R.drawable.ic_star_main_color_2_24_skin))
getString(R.string.favorite_succeed).showToast()
}
}
}
}
- mBinding.ivPlayActivityFavorite.isEnabled = false
+ ivPlayActivityFavorite.isEnabled = false
viewModel.mldAnimeCover.observe(this, {
if (it) {
@@ -197,17 +269,17 @@ class PlayActivity : DetailPlayerActivity() {
})
viewModel.mldPlayBean.observe(this, {
- mBinding.srlPlayActivity.isRefreshing = false
+ srlPlayActivity.isRefreshing = false
val title = viewModel.playBean?.title?.title
- mBinding.tvPlayActivityTitle.text = title
+ tvPlayActivityTitle.text = title
adapter.notifyDataSetChanged()
favoriteBeanDataReady++
if (isFirstTime) {
- mBinding.avpPlayActivity.startPlay()
+ avpPlayActivity.startPlay()
isFirstTime = false
}
})
@@ -241,11 +313,11 @@ class PlayActivity : DetailPlayerActivity() {
})
viewModel.mldAnimeEpisodeDataRefreshed.observe(this, {
- if (it) mBinding.avpPlayActivity.currentPlayer
+ if (it) avpPlayActivity.currentPlayer
.startPlay(partUrl = viewModel.animeEpisodeDataBean.actionUrl)
})
- mBinding.srlPlayActivity.isRefreshing = true
+ srlPlayActivity.isRefreshing = true
viewModel.getPlayData(partUrl)
viewModel.getAnimeCoverImageBean(detailPartUrl)
@@ -259,7 +331,7 @@ class PlayActivity : DetailPlayerActivity() {
}
fun startPlay2(url: String, title: String, partUrl: String = this@PlayActivity.partUrl) {
- mBinding.avpPlayActivity.startPlay(url, title, partUrl)
+ avpPlayActivity.startPlay(url, title, partUrl)
}
private fun GSYBaseVideoPlayer.startPlay(
@@ -336,6 +408,38 @@ class PlayActivity : DetailPlayerActivity() {
viewModel.clearActivity()
}
+ override fun onVideoSizeChanged() {
+ val tag = avpPlayActivity.tag
+ if (tag is String && tag == "sw600dp-land") return
+ avpPlayActivity.measure(
+ View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
+ View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
+ )
+ val videoHeight: Int = avpPlayActivity.currentVideoHeight
+ val videoWidth: Int = avpPlayActivity.currentVideoWidth
+ val ratio = videoWidth.toDouble() / videoHeight
+ val playerWidth: Int = avpPlayActivity.width
+ if (abs(playerWidth.toDouble() / avpPlayActivity.height - ratio) < 0.001) return
+ var playerHeight = playerWidth / ratio
+ val playerParent = window.decorView as ViewGroup
+ playerParent.measure(
+ View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
+ View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
+ )
+ val parentHeight = playerParent.height
+ if (playerHeight > parentHeight * 0.75) playerHeight = parentHeight * 0.75
+ val layoutParams: ViewGroup.LayoutParams = avpPlayActivity.layoutParams
+ ValueAnimator.ofInt(layoutParams.height, playerHeight.toInt())
+ .setDuration(200)
+ .apply {
+ addUpdateListener { animation ->
+ layoutParams.height = animation.animatedValue as Int
+ avpPlayActivity.requestLayout()
+ }
+ start()
+ }
+ }
+
override fun onPlayError(url: String?, vararg objects: Any?) {
super.onPlayError(url, *objects)
"${objects[0].toString()}, ${getString(R.string.get_data_failed)}".showToast()
@@ -348,11 +452,16 @@ class PlayActivity : DetailPlayerActivity() {
// }
}
+ override fun onQuitFullscreen(url: String?, vararg objects: Any?) {
+ super.onQuitFullscreen(url, *objects)
+ adapter.notifyDataSetChanged()
+ }
+
override fun onPrepared(url: String?, vararg objects: Any?) {
super.onPrepared(url, *objects)
//调整触摸滑动快进的比例
//毫秒,刚好划一屏1分35秒
- mBinding.avpPlayActivity.currentPlayer.apply {
+ avpPlayActivity.currentPlayer.apply {
seekRatio = duration / 90_000f
if (danmuUrl.isNotBlank() && this is DanmakuVideoPlayer && !this@PlayActivity.isDestroyed) {
this@PlayActivity.getString(R.string.the_video_has_danmu).showToast()
@@ -361,7 +470,35 @@ class PlayActivity : DetailPlayerActivity() {
}
}
- override fun getGSYVideoPlayer(): DanmakuVideoPlayer = mBinding.avpPlayActivity
+ override fun videoPlayStatusChanged(playing: Boolean) {
+ super.videoPlayStatusChanged(playing)
+ canCollapsed(!playing)
+ tvPlayActivityToolbarTitle?.text =
+ if (avpPlayActivity.currentState == CURRENT_STATE_AUTO_COMPLETE)
+ getString(R.string.replay_video)
+ else getString(R.string.play_video_now)
+ }
+
+ private fun canCollapsed(enable: Boolean) {
+ if (lastCanCollapsed == enable) return
+ lastCanCollapsed = enable
+ nsvPlayActivity?.let {
+ ViewCompat.setNestedScrollingEnabled(it, enable)
+ }
+ ablPlayActivity?.let {
+ val params = it.layoutParams as CoordinatorLayout.LayoutParams
+ if (params.behavior == null) params.behavior = AppBarLayout.Behavior()
+ val behaviour = params.behavior as AppBarLayout.Behavior
+ behaviour.setDragCallback(object : AppBarLayout.Behavior.DragCallback() {
+ override fun canDrag(appBarLayout: AppBarLayout): Boolean {
+ return enable
+ }
+ })
+ if (!enable) it.setExpanded(true)
+ }
+ }
+
+ override fun getGSYVideoPlayer(): DanmakuVideoPlayer = avpPlayActivity
override fun getGSYVideoOptionBuilder(): GSYVideoOptionBuilder {
return GSYVideoOptionBuilder()
@@ -409,7 +546,7 @@ class PlayActivity : DetailPlayerActivity() {
recyclerView.adapter = adapter
viewModel.mldEpisodesList.observe(this, Observer {
adapter.notifyDataSetChanged()
- mBinding.avpPlayActivity.setEpisodeAdapter(
+ avpPlayActivity.setEpisodeAdapter(
PlayerEpisodeRecyclerViewAdapter(
this,
viewModel.episodesList
@@ -500,7 +637,7 @@ class PlayActivity : DetailPlayerActivity() {
)
holder.tvTitle.text = item.title
holder.itemView.setOnClickListener {
- activity.mBinding.avpPlayActivity.currentPlayer.run {
+ activity.avpPlayActivity.currentPlayer.run {
if (this is AnimeVideoPlayer) {
getRightContainer()?.gone()
// 因为右侧界面显示时,不在xx秒后隐藏界面,所以要恢复xx秒后隐藏控制界面
diff --git a/app/src/main/java/com/skyd/imomoe/view/adapter/PlayAdapter.kt b/app/src/main/java/com/skyd/imomoe/view/adapter/PlayAdapter.kt
index 0a35b75b..3eeae1e1 100644
--- a/app/src/main/java/com/skyd/imomoe/view/adapter/PlayAdapter.kt
+++ b/app/src/main/java/com/skyd/imomoe/view/adapter/PlayAdapter.kt
@@ -15,6 +15,7 @@ import com.skyd.imomoe.util.Util.getResColor
import com.skyd.imomoe.util.Util.getResDrawable
import com.skyd.imomoe.util.Util.process
import com.skyd.imomoe.util.Util.showToast
+import com.skyd.imomoe.util.Util.sp
import com.skyd.imomoe.util.coil.CoilUtil.loadImage
import com.skyd.imomoe.view.activity.PlayActivity
import com.skyd.imomoe.view.adapter.decoration.AnimeCoverItemDecoration
@@ -45,7 +46,6 @@ class PlayAdapter(
}
}
holder is Header1ViewHolder -> {
- holder.tvHeader1Title.textSize = 15f
holder.tvHeader1Title.text = item.title
}
holder is AnimeCover2ViewHolder -> {
diff --git a/app/src/main/java/com/skyd/imomoe/view/component/SmartScrollingFooterBehavior.kt b/app/src/main/java/com/skyd/imomoe/view/component/SmartScrollingFooterBehavior.kt
new file mode 100644
index 00000000..973e484c
--- /dev/null
+++ b/app/src/main/java/com/skyd/imomoe/view/component/SmartScrollingFooterBehavior.kt
@@ -0,0 +1,38 @@
+package com.skyd.imomoe.view.component
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import androidx.coordinatorlayout.widget.CoordinatorLayout
+import com.google.android.material.appbar.AppBarLayout
+import com.google.android.material.appbar.AppBarLayout.ScrollingViewBehavior
+
+class SmartScrollingFooterBehavior : ScrollingViewBehavior {
+ private lateinit var appBarLayout: AppBarLayout
+
+ constructor() : super()
+ constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
+
+ override fun onDependentViewChanged(
+ parent: CoordinatorLayout,
+ child: View,
+ dependency: View
+ ): Boolean {
+ if (!this::appBarLayout.isInitialized) {
+ appBarLayout = dependency as AppBarLayout
+ }
+ val result = super.onDependentViewChanged(parent, child, dependency)
+ val bottomPadding = calculateBottomPadding(appBarLayout)
+ val paddingChanged = bottomPadding != child.paddingBottom
+ if (paddingChanged) {
+ child.setPadding(child.paddingLeft, child.paddingTop, child.paddingRight, bottomPadding)
+ child.requestLayout()
+ }
+ return paddingChanged || result
+ }
+
+ private fun calculateBottomPadding(dependency: AppBarLayout): Int {
+ val totalScrollRange = dependency.totalScrollRange
+ return totalScrollRange + dependency.top
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/skyd/imomoe/view/component/player/AnimeOrientationUtils.kt b/app/src/main/java/com/skyd/imomoe/view/component/player/AnimeOrientationUtils.kt
new file mode 100644
index 00000000..bd438040
--- /dev/null
+++ b/app/src/main/java/com/skyd/imomoe/view/component/player/AnimeOrientationUtils.kt
@@ -0,0 +1,61 @@
+package com.skyd.imomoe.view.component.player
+
+import android.app.Activity
+import android.content.pm.ActivityInfo
+import android.os.Build
+import com.shuyu.gsyvideoplayer.utils.Debuger
+import com.shuyu.gsyvideoplayer.utils.OrientationOption
+import com.shuyu.gsyvideoplayer.utils.OrientationUtils
+import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer
+import java.lang.ref.WeakReference
+
+class AnimeOrientationUtils : OrientationUtils {
+ private val LAND_TYPE_NULL = 0
+ private val LAND_TYPE_NORMAL = 1
+ private val LAND_TYPE_REVERSE = 2
+ private val mVideoPlayer: GSYBaseVideoPlayer?
+ private val mActivity: WeakReference
+
+ constructor(activity: Activity, gsyVideoPlayer: GSYBaseVideoPlayer?) :
+ super(activity, gsyVideoPlayer) {
+ mActivity = WeakReference(activity)
+ mVideoPlayer = gsyVideoPlayer
+ }
+
+ constructor(
+ activity: Activity,
+ gsyVideoPlayer: GSYBaseVideoPlayer?,
+ orientationOption: OrientationOption?
+ ) : super(activity, gsyVideoPlayer, orientationOption) {
+ mActivity = WeakReference(activity)
+ mVideoPlayer = gsyVideoPlayer
+ }
+
+ private fun setRequestedOrientation2(requestedOrientation: Int) {
+ val activity = mActivity.get() ?: return
+ try {
+ activity.requestedOrientation = requestedOrientation
+ } catch (exception: IllegalStateException) {
+ if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O || Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) {
+ Debuger.printfError("OrientationUtils", exception)
+ } else {
+ exception.printStackTrace()
+ }
+ }
+ }
+
+ fun backToProtVideo2(): Int {
+ if (isLand > LAND_TYPE_NULL) {
+ isClick = true
+ setRequestedOrientation2(ActivityInfo.SCREEN_ORIENTATION_USER)
+ if (mVideoPlayer != null && mVideoPlayer.fullscreenButton != null) mVideoPlayer.fullscreenButton.setImageResource(
+ mVideoPlayer.enlargeImageRes
+ )
+ isLand = LAND_TYPE_NULL
+ isClickPort = false
+ return 500
+ }
+ return LAND_TYPE_NULL
+// return super.backToProtVideo()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/skyd/imomoe/view/component/player/AnimeVideoPlayer.kt b/app/src/main/java/com/skyd/imomoe/view/component/player/AnimeVideoPlayer.kt
index 2390da9d..2c5613b6 100644
--- a/app/src/main/java/com/skyd/imomoe/view/component/player/AnimeVideoPlayer.kt
+++ b/app/src/main/java/com/skyd/imomoe/view/component/player/AnimeVideoPlayer.kt
@@ -13,7 +13,8 @@ import android.widget.*
import androidx.core.view.children
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import com.skyd.skin.SkinManager
+import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
+import com.shuyu.gsyvideoplayer.utils.CommonUtil
import com.shuyu.gsyvideoplayer.utils.Debuger
import com.shuyu.gsyvideoplayer.utils.GSYVideoType
import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer
@@ -36,6 +37,9 @@ import com.skyd.imomoe.view.activity.DlnaActivity
import com.skyd.imomoe.view.adapter.SkinRvAdapter
import com.skyd.imomoe.view.component.ZoomView
import com.skyd.imomoe.view.component.textview.TypefaceTextView
+import com.skyd.skin.SkinManager
+import tv.danmaku.ijk.media.exo2.IjkExo2MediaPlayer
+import tv.danmaku.ijk.media.player.IjkMediaPlayer
import java.io.File
import java.io.Serializable
import kotlin.math.abs
@@ -551,6 +555,13 @@ open class AnimeVideoPlayer : StandardGSYVideoPlayer {
super.onBrightnessSlide(percent)
}
+ override fun onVideoSizeChanged() {
+ super.onVideoSizeChanged()
+ mVideoAllCallBack.let {
+ if (it is MyVideoAllCallBack) it.onVideoSizeChanged()
+ }
+ }
+
//正常
override fun changeUiToNormal() {
super.changeUiToNormal()
@@ -593,19 +604,32 @@ open class AnimeVideoPlayer : StandardGSYVideoPlayer {
mUiCleared = false
}
+ override fun onVideoPause() {
+ super.onVideoPause()
+ mVideoAllCallBack.let {
+ if (it is MyVideoAllCallBack) it.onVideoPause()
+ }
+ }
+
override fun onVideoResume(seek: Boolean) {
// super.onVideoResume(seek)
mPauseBeforePrepared = false
if (mCurrentState == GSYVideoView.CURRENT_STATE_PAUSE) {
try {
clickStartIcon()
-
+ mVideoAllCallBack.let {
+ if (it is MyVideoAllCallBack) it.onVideoResume()
+ }
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
}
+ public override fun clickStartIcon() {
+ super.clickStartIcon()
+ }
+
override fun onClick(v: View) {
super.onClick(v)
@@ -722,6 +746,41 @@ open class AnimeVideoPlayer : StandardGSYVideoPlayer {
}
}
+ override fun onBackFullscreen() {
+ if (!mFullAnimEnd) {
+ return
+ }
+ mIfCurrentIsFullscreen = false
+ var delay = 0
+ if (mOrientationUtils != null) {
+ val orientationUtils = mOrientationUtils
+ delay = if (orientationUtils is AnimeOrientationUtils)
+ orientationUtils.backToProtVideo2()
+ else
+ orientationUtils.backToProtVideo()
+ mOrientationUtils.isEnable = false
+ if (mOrientationUtils != null) {
+ mOrientationUtils.releaseListener()
+ mOrientationUtils = null
+ }
+ }
+
+ if (!mShowFullAnimation) {
+ delay = 0
+ }
+
+ val vp = CommonUtil.scanForActivity(context)
+ .findViewById(Window.ID_ANDROID_CONTENT) as ViewGroup
+ val oldF = vp.findViewById(fullId)
+ if (oldF != null) {
+ //此处fix bug#265,推出全屏的时候,虚拟按键问题
+ val gsyVideoPlayer = oldF as GSYVideoPlayer
+ gsyVideoPlayer.isIfCurrentIsFullscreen = false
+ }
+
+ mInnerHandler.postDelayed({ backToNormal() }, delay.toLong())
+ }
+
fun setEpisodeButtonOnClickListener(listener: OnClickListener) {
mEpisodeButtonOnClickListener = listener
}
diff --git a/app/src/main/java/com/skyd/imomoe/view/component/player/DetailPlayerActivity.java b/app/src/main/java/com/skyd/imomoe/view/component/player/DetailPlayerActivity.java
index 585a7263..f2a9def0 100644
--- a/app/src/main/java/com/skyd/imomoe/view/component/player/DetailPlayerActivity.java
+++ b/app/src/main/java/com/skyd/imomoe/view/component/player/DetailPlayerActivity.java
@@ -3,28 +3,27 @@
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
-
import com.skyd.skin.core.SkinBaseActivity;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder;
-import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack;
import com.shuyu.gsyvideoplayer.utils.OrientationOption;
-import com.shuyu.gsyvideoplayer.utils.OrientationUtils;
import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer;
+import org.jetbrains.annotations.NotNull;
+
import static com.shuyu.gsyvideoplayer.video.base.GSYVideoView.CURRENT_STATE_PAUSE;
/**
* 详情模式播放页面基础类
*/
-public abstract class DetailPlayerActivity extends SkinBaseActivity implements VideoAllCallBack {
+public abstract class DetailPlayerActivity extends SkinBaseActivity implements MyVideoAllCallBack {
protected boolean isPlay;
// 是否是在onPause方法里自动暂停的
protected boolean isPause;
- protected OrientationUtils orientationUtils;
+ protected AnimeOrientationUtils orientationUtils;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -36,7 +35,7 @@ protected void onCreate(Bundle savedInstanceState) {
*/
public void initVideo() {
//外部辅助的旋转,帮助全屏
- orientationUtils = new OrientationUtils(this, getGSYVideoPlayer(), getOrientationOption());
+ orientationUtils = new AnimeOrientationUtils(this, getGSYVideoPlayer(), getOrientationOption());
//初始化不打开外部的旋转
orientationUtils.setEnable(false);
if (getGSYVideoPlayer().getFullscreenButton() != null) {
@@ -48,6 +47,10 @@ public void onClick(View v) {
}
});
}
+ // 退出全屏监听,避免平板退出全屏后变成竖屏
+ getGSYVideoPlayer().setBackFromFullScreenListener(view -> {
+ onBackPressed();
+ });
}
/**
@@ -73,7 +76,7 @@ public void showFull() {
@Override
public void onBackPressed() {
if (orientationUtils != null) {
- orientationUtils.backToProtVideo();
+ orientationUtils.backToProtVideo2();
}
if (GSYVideoManager.backFromWindowFull(this)) {
return;
@@ -120,7 +123,7 @@ protected void onDestroy() {
* orientationUtils 和 detailPlayer.onConfigurationChanged 方法是用于触发屏幕旋转的
*/
@Override
- public void onConfigurationChanged(Configuration newConfig) {
+ public void onConfigurationChanged(@NotNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//如果旋转了就全屏
if (isPlay && !isPause) {
@@ -130,7 +133,7 @@ public void onConfigurationChanged(Configuration newConfig) {
@Override
public void onStartPrepared(String url, Object... objects) {
-
+ videoPlayStatusChanged(true);
}
@Override
@@ -143,6 +146,7 @@ public void onPrepared(String url, Object... objects) {
orientationUtils.setEnable(getDetailOrientationRotateAuto() && !isAutoFullWithSize());
isPlay = true;
isPause = false;
+ videoPlayStatusChanged(true);
}
@Override
@@ -157,22 +161,22 @@ public void onClickStartError(String url, Object... objects) {
@Override
public void onClickStop(String url, Object... objects) {
-
+ videoPlayStatusChanged(false);
}
@Override
public void onClickStopFullscreen(String url, Object... objects) {
-
+ videoPlayStatusChanged(false);
}
@Override
public void onClickResume(String url, Object... objects) {
-
+ videoPlayStatusChanged(true);
}
@Override
public void onClickResumeFullscreen(String url, Object... objects) {
-
+ videoPlayStatusChanged(true);
}
@Override
@@ -187,7 +191,7 @@ public void onClickSeekbarFullscreen(String url, Object... objects) {
@Override
public void onAutoComplete(String url, Object... objects) {
-
+ videoPlayStatusChanged(false);
}
@Override
@@ -229,7 +233,7 @@ public void onTouchScreenSeekLight(String url, Object... objects) {
@Override
public void onPlayError(String url, Object... objects) {
-
+ videoPlayStatusChanged(false);
}
@Override
@@ -249,7 +253,7 @@ public void onClickBlankFullscreen(String url, Object... objects) {
@Override
public void onComplete(String url, Object... objects) {
-
+ videoPlayStatusChanged(false);
}
public boolean hideActionBarWhenFull() {
@@ -293,4 +297,23 @@ public OrientationOption getOrientationOption() {
public boolean isAutoFullWithSize() {
return false;
}
+
+ @Override
+ public void onVideoPause() {
+ videoPlayStatusChanged(false);
+ }
+
+ @Override
+ public void onVideoResume() {
+ videoPlayStatusChanged(true);
+ }
+
+ /**
+ * 视频播放状态变化
+ *
+ * @param playing false:未在播放(包括播放失败暂停等等);true:正在播放(包括正在准备加载、缓冲等等)
+ */
+ protected void videoPlayStatusChanged(boolean playing) {
+
+ }
}
diff --git a/app/src/main/java/com/skyd/imomoe/view/component/player/MyVideoAllCallBack.kt b/app/src/main/java/com/skyd/imomoe/view/component/player/MyVideoAllCallBack.kt
new file mode 100644
index 00000000..affc0fd5
--- /dev/null
+++ b/app/src/main/java/com/skyd/imomoe/view/component/player/MyVideoAllCallBack.kt
@@ -0,0 +1,11 @@
+package com.skyd.imomoe.view.component.player
+
+import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack
+
+interface MyVideoAllCallBack : VideoAllCallBack {
+ fun onVideoPause()
+
+ fun onVideoResume()
+
+ fun onVideoSizeChanged()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/skyd/imomoe/view/fragment/HomeFragment.kt b/app/src/main/java/com/skyd/imomoe/view/fragment/HomeFragment.kt
index 9df3f545..894f7e46 100644
--- a/app/src/main/java/com/skyd/imomoe/view/fragment/HomeFragment.kt
+++ b/app/src/main/java/com/skyd/imomoe/view/fragment/HomeFragment.kt
@@ -51,8 +51,8 @@ class HomeFragment : BaseFragment(), EventBusSubscriber {
override fun getBinding(inflater: LayoutInflater, container: ViewGroup?): FragmentHomeBinding =
FragmentHomeBinding.inflate(inflater, container, false)
- override fun onActivityCreated(savedInstanceState: Bundle?) {
- super.onActivityCreated(savedInstanceState)
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
// 清除缓存,以免换肤后颜色错误
viewModel.childViewPool.clear()
diff --git a/app/src/main/res/layout-sw600dp-land/activity_play.xml b/app/src/main/res/layout-sw600dp-land/activity_play.xml
new file mode 100644
index 00000000..2049684e
--- /dev/null
+++ b/app/src/main/res/layout-sw600dp-land/activity_play.xml
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-sw600dp-port/activity_play.xml b/app/src/main/res/layout-sw600dp-port/activity_play.xml
new file mode 100644
index 00000000..be1a2202
--- /dev/null
+++ b/app/src/main/res/layout-sw600dp-port/activity_play.xml
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml
index ea2b795f..be1a2202 100644
--- a/app/src/main/res/layout/activity_play.xml
+++ b/app/src/main/res/layout/activity_play.xml
@@ -7,95 +7,162 @@
android:background="@color/white_skin"
tools:context=".view.activity.PlayActivity">
-
+ android:layout_height="wrap_content">
-
+ android:layout_height="wrap_content"
+ app:contentScrim="@color/main_color_2_skin"
+ app:layout_scrollFlags="scroll|exitUntilCollapsed"
+ app:titleEnabled="false">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_height="wrap_content">
-
-
+ android:layout_height="wrap_content">
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+ android:layout_height="1px"
+ android:layout_marginHorizontal="16dp"
+ android:layout_marginTop="12dp"
+ android:background="@color/foreground_main_color_2_skin"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/tv_play_activity_title" />
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_anime_cover_1.xml b/app/src/main/res/layout/item_anime_cover_1.xml
index e583e32f..b53f42ff 100644
--- a/app/src/main/res/layout/item_anime_cover_1.xml
+++ b/app/src/main/res/layout/item_anime_cover_1.xml
@@ -10,8 +10,9 @@
@@ -19,14 +20,14 @@
diff --git a/app/src/main/res/layout/item_anime_cover_4.xml b/app/src/main/res/layout/item_anime_cover_4.xml
index c842a976..0924ce45 100644
--- a/app/src/main/res/layout/item_anime_cover_4.xml
+++ b/app/src/main/res/layout/item_anime_cover_4.xml
@@ -1,31 +1,32 @@
-
+ android:layout_height="0dp"
+ app:cardCornerRadius="5dp"
+ app:layout_constraintDimensionRatio="7:5"
+ app:layout_constraintTop_toTopOf="parent">
@@ -38,7 +39,12 @@
android:maxLines="3"
android:textColor="@color/foreground_black_skin"
android:textSize="13sp"
+ app:layout_constrainedWidth="true"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/cv_anime_cover_4_cover"
app:typeface="bPRTypeface"
tools:text="中二病也要谈恋爱!" />
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_anime_cover_6.xml b/app/src/main/res/layout/item_anime_cover_6.xml
index ea86ff12..88371b3d 100644
--- a/app/src/main/res/layout/item_anime_cover_6.xml
+++ b/app/src/main/res/layout/item_anime_cover_6.xml
@@ -9,7 +9,7 @@
android:id="@+id/iv_anime_cover_6_cover"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:scaleType="fitXY"
+ android:scaleType="centerCrop"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
diff --git a/app/src/main/res/layout/item_anime_cover_8.xml b/app/src/main/res/layout/item_anime_cover_8.xml
index ced0268c..f0f395a4 100644
--- a/app/src/main/res/layout/item_anime_cover_8.xml
+++ b/app/src/main/res/layout/item_anime_cover_8.xml
@@ -15,9 +15,10 @@
-
+ android:layout_marginEnd="16dp">
-
+ android:layout_height="0dp"
+ app:cardCornerRadius="6dp"
+ app:cardElevation="3dp"
+ app:layout_constraintDimensionRatio="7:4"
+ app:layout_constraintTop_toTopOf="parent">
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_header_1.xml b/app/src/main/res/layout/item_header_1.xml
index ea8e9daf..245596fc 100644
--- a/app/src/main/res/layout/item_header_1.xml
+++ b/app/src/main/res/layout/item_header_1.xml
@@ -3,7 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tv_header_1_title"
- android:layout_width="wrap_content"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="16dp"
android:paddingTop="10dp"
diff --git a/app/src/main/res/layout/item_skin_cover_1.xml b/app/src/main/res/layout/item_skin_cover_1.xml
index 7cf8713d..334313b9 100644
--- a/app/src/main/res/layout/item_skin_cover_1.xml
+++ b/app/src/main/res/layout/item_skin_cover_1.xml
@@ -17,8 +17,9 @@
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 24756ed8..fc1db0f8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -156,4 +156,7 @@
使用须知
Hello blank fragment
跳转到通知界面错误,参数传递不正确!
+ 继续播放
+ 立即播放
+ 重新播放
diff --git a/skin/src/main/java/com/skyd/skin/SkinManager.kt b/skin/src/main/java/com/skyd/skin/SkinManager.kt
index 8adf5bb8..9e82788e 100644
--- a/skin/src/main/java/com/skyd/skin/SkinManager.kt
+++ b/skin/src/main/java/com/skyd/skin/SkinManager.kt
@@ -73,7 +73,8 @@ object SkinManager {
android.R.attr.indeterminateTint,
android.R.attr.thumb,
android.R.attr.progressDrawable,
- R.attr.menu
+ R.attr.menu,
+ R.attr.contentScrim
).apply { sort() } // 需要升序排序,所以要调用sort()
// 在app中自定义
@@ -279,6 +280,10 @@ object SkinManager {
if (resId != -1) skinAttrsSet.attrsMap[ProgressDrawableAttr.TAG] =
ProgressDrawableAttr().apply { attrResourceRefId = resId }
}
+ R.attr.contentScrim -> {
+ if (resId != -1) skinAttrsSet.attrsMap[ContentScrimAttr.TAG] =
+ ContentScrimAttr().apply { attrResourceRefId = resId }
+ }
R.attr.menu -> {
}
}
diff --git a/skin/src/main/java/com/skyd/skin/core/attrs/ContentScrimAttr.kt b/skin/src/main/java/com/skyd/skin/core/attrs/ContentScrimAttr.kt
new file mode 100644
index 00000000..4546b666
--- /dev/null
+++ b/skin/src/main/java/com/skyd/skin/core/attrs/ContentScrimAttr.kt
@@ -0,0 +1,33 @@
+package com.skyd.skin.core.attrs
+
+import android.graphics.drawable.Drawable
+import android.view.View
+import androidx.core.content.ContextCompat
+import com.google.android.material.appbar.CollapsingToolbarLayout
+import com.skyd.skin.core.SkinResourceProcessor
+
+
+class ContentScrimAttr : SkinAttr() {
+ companion object {
+ const val TAG = "contentScrim"
+ }
+
+ override fun applySkin(view: View) {
+ if (view is CollapsingToolbarLayout && attrResourceRefId != -1) {
+ val skinResProcessor = SkinResourceProcessor.instance
+ if (skinResProcessor.usingDefaultSkin() && skinResProcessor.usingInnerAppSkin()) {
+ val drawable = ContextCompat.getDrawable(view.context, attrResourceRefId)
+ view.contentScrim = drawable
+ } else {
+ // 获取皮肤包资源
+ val skinResourceId = skinResProcessor.getBackgroundOrSrc(attrResourceRefId)
+ if (skinResourceId is Int) {
+ view.setContentScrimColor(skinResourceId)
+ } else {
+ val drawable = skinResourceId as Drawable
+ view.contentScrim = drawable
+ }
+ }
+ }
+ }
+}
\ No newline at end of file