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