update
This commit is contained in:
parent
3f389e24e9
commit
e11a767758
@ -28,7 +28,7 @@
|
|||||||
tools:targetApi="31">
|
tools:targetApi="31">
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.activity.LaunchActivity"
|
android:name=".ui.activity.SplashActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:screenOrientation="portrait">
|
android:screenOrientation="portrait">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@ -41,7 +41,7 @@
|
|||||||
android:name=".ui.activity.MainActivity"
|
android:name=".ui.activity.MainActivity"
|
||||||
android:screenOrientation="portrait" />
|
android:screenOrientation="portrait" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.activity.PlayDetailsActivity"
|
android:name=".ui.activity.PlayerActivity"
|
||||||
android:screenOrientation="portrait" />
|
android:screenOrientation="portrait" />
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.activity.AboutActivity"
|
android:name=".ui.activity.AboutActivity"
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import com.offline.music.task.player.db.bean.ResourcesList
|
|||||||
import com.offline.music.task.player.db.tools.CurrentAudioManager
|
import com.offline.music.task.player.db.tools.CurrentAudioManager
|
||||||
import com.offline.music.task.player.db.tools.DatabaseManager
|
import com.offline.music.task.player.db.tools.DatabaseManager
|
||||||
import com.offline.music.task.player.tools.media.MediaControllerManager
|
import com.offline.music.task.player.tools.media.MediaControllerManager
|
||||||
import com.offline.music.task.player.tools.parseResources
|
import com.offline.music.task.player.tools.util.parseResources
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|||||||
@ -1,38 +0,0 @@
|
|||||||
package com.offline.music.task.player.db.tools
|
|
||||||
|
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import androidx.lifecycle.ViewModel
|
|
||||||
import androidx.lifecycle.viewModelScope
|
|
||||||
import androidx.room.Room
|
|
||||||
import com.offline.music.task.player.ProApp
|
|
||||||
import com.offline.music.task.player.db.bean.Audio
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
|
|
||||||
class CollectViewModel : ViewModel() {
|
|
||||||
private var likeData: MutableLiveData<List<Audio>> = MutableLiveData<List<Audio>>()
|
|
||||||
|
|
||||||
private val database = Room.databaseBuilder(
|
|
||||||
ProApp.appContext, AppDatabase::class.java, "local_audio_viewer_database"
|
|
||||||
).build()
|
|
||||||
|
|
||||||
private val audioFileDao = database.localAudioDao()
|
|
||||||
|
|
||||||
init {
|
|
||||||
viewModelScope.launch {
|
|
||||||
likeData.value = audioFileDao.getCollectData()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun update() {
|
|
||||||
viewModelScope.launch {
|
|
||||||
likeData.value = audioFileDao.getCollectData()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getList() = likeData
|
|
||||||
|
|
||||||
override fun onCleared() {
|
|
||||||
super.onCleared()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -16,7 +16,7 @@ import com.offline.music.task.player.R
|
|||||||
import com.offline.music.task.player.db.bean.Audio
|
import com.offline.music.task.player.db.bean.Audio
|
||||||
import com.offline.music.task.player.db.bean.CurrentPlayingAudio
|
import com.offline.music.task.player.db.bean.CurrentPlayingAudio
|
||||||
import com.offline.music.task.player.service.LocalPlaybackService
|
import com.offline.music.task.player.service.LocalPlaybackService
|
||||||
import com.offline.music.task.player.tools.containsContent
|
import com.offline.music.task.player.tools.util.containsContent
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|||||||
@ -1,66 +0,0 @@
|
|||||||
package com.offline.music.task.player.tools.sp
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.SharedPreferences
|
|
||||||
import androidx.core.content.edit
|
|
||||||
import kotlin.properties.ReadWriteProperty
|
|
||||||
import kotlin.reflect.KProperty
|
|
||||||
|
|
||||||
class SharedPreferencesHelper(context: Context) {
|
|
||||||
companion object {
|
|
||||||
const val CURRENT_PLAYING_AUDIO = "current_playing_audio"
|
|
||||||
}
|
|
||||||
|
|
||||||
private val preferences: SharedPreferences = context.getSharedPreferences(context.packageName, Context.MODE_PRIVATE)
|
|
||||||
|
|
||||||
var currentPlayingAudio: Boolean by preferences.boolean(
|
|
||||||
key = CURRENT_PLAYING_AUDIO,
|
|
||||||
defaultValue = false
|
|
||||||
)
|
|
||||||
|
|
||||||
private inline fun <reified T : Any> SharedPreferences.boolean(
|
|
||||||
key: String,
|
|
||||||
defaultValue: T
|
|
||||||
): ReadWriteProperty<Any, T> {
|
|
||||||
return object : ReadWriteProperty<Any, T> {
|
|
||||||
override fun getValue(thisRef: Any, property: KProperty<*>): T {
|
|
||||||
return when (T::class) {
|
|
||||||
Boolean::class -> getBoolean(key, defaultValue as Boolean) as T
|
|
||||||
else -> throw IllegalArgumentException("Unsupported type")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
|
|
||||||
edit {
|
|
||||||
when (T::class) {
|
|
||||||
Boolean::class -> putBoolean(key, value as Boolean)
|
|
||||||
else -> throw IllegalArgumentException("Unsupported type")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private inline fun <reified T : Any> SharedPreferences.string(
|
|
||||||
key: String,
|
|
||||||
defaultValue: T
|
|
||||||
): ReadWriteProperty<Any, T> {
|
|
||||||
return object : ReadWriteProperty<Any, T> {
|
|
||||||
override fun getValue(thisRef: Any, property: KProperty<*>): T {
|
|
||||||
return when (T::class) {
|
|
||||||
String::class -> getString(key, defaultValue as String) as T
|
|
||||||
else -> throw IllegalArgumentException("Unsupported type")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
|
|
||||||
edit {
|
|
||||||
when (T::class) {
|
|
||||||
String::class -> putString(key, value as String)
|
|
||||||
else -> throw IllegalArgumentException("Unsupported type")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.offline.music.task.player.tools
|
package com.offline.music.task.player.tools.util
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.offline.music.task.player.tools
|
package com.offline.music.task.player.tools.util
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.offline.music.task.player.tools
|
package com.offline.music.task.player.tools.util
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.offline.music.task.player.tools
|
package com.offline.music.task.player.tools.util
|
||||||
|
|
||||||
import android.content.ActivityNotFoundException
|
import android.content.ActivityNotFoundException
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package com.offline.music.task.player.tools
|
package com.offline.music.task.player.tools.util
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.media.MediaMetadataRetriever
|
import android.media.MediaMetadataRetriever
|
||||||
@ -4,7 +4,7 @@ import android.os.Bundle
|
|||||||
import com.gyf.immersionbar.ktx.immersionBar
|
import com.gyf.immersionbar.ktx.immersionBar
|
||||||
import com.offline.music.task.player.databinding.ActivityAboutBinding
|
import com.offline.music.task.player.databinding.ActivityAboutBinding
|
||||||
|
|
||||||
import com.offline.music.task.player.tools.getAppVersion
|
import com.offline.music.task.player.tools.util.getAppVersion
|
||||||
|
|
||||||
class AboutActivity : BaseActivity() {
|
class AboutActivity : BaseActivity() {
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import com.offline.music.task.player.ProApp
|
|||||||
import com.offline.music.task.player.R
|
import com.offline.music.task.player.R
|
||||||
import com.offline.music.task.player.databinding.ActivityMainBinding
|
import com.offline.music.task.player.databinding.ActivityMainBinding
|
||||||
import com.offline.music.task.player.db.bean.Audio
|
import com.offline.music.task.player.db.bean.Audio
|
||||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||||
import com.offline.music.task.player.tools.media.MediaControllerManager
|
import com.offline.music.task.player.tools.media.MediaControllerManager
|
||||||
import com.offline.music.task.player.ui.fragment.HomeFragment
|
import com.offline.music.task.player.ui.fragment.HomeFragment
|
||||||
import com.offline.music.task.player.ui.fragment.MeFragment
|
import com.offline.music.task.player.ui.fragment.MeFragment
|
||||||
@ -110,8 +110,8 @@ class MainActivity : BaseActivity() {
|
|||||||
duration,
|
duration,
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
val intent = Intent(this, PlayDetailsActivity::class.java);
|
val intent = Intent(this, PlayerActivity::class.java);
|
||||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -16,12 +16,12 @@ import com.gyf.immersionbar.ktx.immersionBar
|
|||||||
import com.offline.music.task.player.R
|
import com.offline.music.task.player.R
|
||||||
import com.offline.music.task.player.databinding.ActivityPlayDetailsBinding
|
import com.offline.music.task.player.databinding.ActivityPlayDetailsBinding
|
||||||
import com.offline.music.task.player.db.bean.Audio
|
import com.offline.music.task.player.db.bean.Audio
|
||||||
import com.offline.music.task.player.tools.containsContent
|
import com.offline.music.task.player.tools.util.containsContent
|
||||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||||
import com.offline.music.task.player.tools.media.MediaControllerManager
|
import com.offline.music.task.player.tools.media.MediaControllerManager
|
||||||
|
|
||||||
class PlayDetailsActivity : BaseActivity() {
|
class PlayerActivity : BaseActivity() {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val KEY_DETAILS_AUDIO = "key_details_audio"
|
const val KEY_DETAILS_AUDIO = "key_details_audio"
|
||||||
@ -9,7 +9,7 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class LaunchActivity : BaseActivity() {
|
class SplashActivity : BaseActivity() {
|
||||||
private lateinit var binding: ActivityLaunchBinding
|
private lateinit var binding: ActivityLaunchBinding
|
||||||
private val coroutineScope = CoroutineScope(Dispatchers.Main)
|
private val coroutineScope = CoroutineScope(Dispatchers.Main)
|
||||||
private val countTime: Long = 3000
|
private val countTime: Long = 3000
|
||||||
@ -10,15 +10,15 @@ import com.offline.music.task.player.ProApp
|
|||||||
import com.offline.music.task.player.R
|
import com.offline.music.task.player.R
|
||||||
import com.offline.music.task.player.databinding.RealHumanVoiceLayoutBinding
|
import com.offline.music.task.player.databinding.RealHumanVoiceLayoutBinding
|
||||||
import com.offline.music.task.player.db.bean.Audio
|
import com.offline.music.task.player.db.bean.Audio
|
||||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||||
import com.offline.music.task.player.ui.activity.PlayDetailsActivity
|
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||||
|
|
||||||
class RealHumanVoiceAdapter(
|
class HomeRecommendAdapter(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val pdfList: List<Audio>,
|
private val pdfList: List<Audio>,
|
||||||
) :
|
) :
|
||||||
RecyclerView.Adapter<RealHumanVoiceAdapter.PDFViewHolder>() {
|
RecyclerView.Adapter<HomeRecommendAdapter.PDFViewHolder>() {
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
||||||
val binding =
|
val binding =
|
||||||
@ -30,8 +30,8 @@ class RealHumanVoiceAdapter(
|
|||||||
val audio = pdfList[position]
|
val audio = pdfList[position]
|
||||||
holder.bind(audio)
|
holder.bind(audio)
|
||||||
holder.itemView.setOnClickListener {
|
holder.itemView.setOnClickListener {
|
||||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
val intent = Intent(context, PlayerActivity::class.java);
|
||||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||||
context.startActivity(intent)
|
context.startActivity(intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
package com.offline.music.task.player.ui.adapter
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.offline.music.task.player.ProApp
|
||||||
|
import com.offline.music.task.player.R
|
||||||
|
import com.offline.music.task.player.databinding.SoundsOfNatureLayoutBinding
|
||||||
|
import com.offline.music.task.player.db.bean.Audio
|
||||||
|
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||||
|
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||||
|
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||||
|
|
||||||
|
|
||||||
|
class HomeVoiceOfNatureAdapter(
|
||||||
|
private val context: Context,
|
||||||
|
private val pdfList: List<Audio>,
|
||||||
|
) :
|
||||||
|
RecyclerView.Adapter<HomeVoiceOfNatureAdapter.PDFViewHolder>() {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
||||||
|
val binding =
|
||||||
|
SoundsOfNatureLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||||
|
return PDFViewHolder(binding)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: PDFViewHolder, position: Int) {
|
||||||
|
val audio = pdfList[position]
|
||||||
|
holder.binding.apply {
|
||||||
|
Glide.with(context)
|
||||||
|
.load("file:///android_asset/${audio.image}")
|
||||||
|
.into(image)
|
||||||
|
name.text = audio.name
|
||||||
|
val s = getAudioDurationFromAssets(context, audio.file)
|
||||||
|
desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||||
|
|
||||||
|
if (ProApp.currentPlayingAudio != null) {
|
||||||
|
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||||
|
playingLayout.visibility = View.VISIBLE
|
||||||
|
name.setTextColor(context.getColor(R.color.blue))
|
||||||
|
desc.setTextColor(context.getColor(R.color.blue))
|
||||||
|
} else {
|
||||||
|
playingLayout.visibility = View.GONE
|
||||||
|
name.setTextColor(context.getColor(R.color.white))
|
||||||
|
desc.setTextColor(context.getColor(R.color.white_60))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
holder.itemView.setOnClickListener {
|
||||||
|
val intent = Intent(context, PlayerActivity::class.java);
|
||||||
|
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||||
|
context.startActivity(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = pdfList.size
|
||||||
|
|
||||||
|
inner class PDFViewHolder(val binding: SoundsOfNatureLayoutBinding) :
|
||||||
|
RecyclerView.ViewHolder(binding.root)
|
||||||
|
}
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
package com.offline.music.task.player.ui.adapter
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.offline.music.task.player.ProApp
|
||||||
|
import com.offline.music.task.player.R
|
||||||
|
import com.offline.music.task.player.databinding.SoundsOfAppliancesLayoutBinding
|
||||||
|
import com.offline.music.task.player.db.bean.Audio
|
||||||
|
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||||
|
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||||
|
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||||
|
|
||||||
|
class HomeWhiteNoiseAdapter(
|
||||||
|
private val context: Context,
|
||||||
|
private val pdfList: List<Audio>,
|
||||||
|
) :
|
||||||
|
RecyclerView.Adapter<HomeWhiteNoiseAdapter.PDFViewHolder>() {
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
||||||
|
val binding =
|
||||||
|
SoundsOfAppliancesLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||||
|
return PDFViewHolder(binding)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: PDFViewHolder, position: Int) {
|
||||||
|
val audio = pdfList[position]
|
||||||
|
Glide.with(context)
|
||||||
|
.load("file:///android_asset/${audio.image}")
|
||||||
|
.into(holder.binding.image)
|
||||||
|
holder.binding.name.text = audio.name
|
||||||
|
val s = getAudioDurationFromAssets(context, audio.file)
|
||||||
|
holder.binding.desc.text = convertMillisToMinutesAndSecondsString(s)
|
||||||
|
|
||||||
|
if (ProApp.currentPlayingAudio != null) {
|
||||||
|
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
||||||
|
holder.binding.playingLayout.visibility = View.VISIBLE
|
||||||
|
holder.binding.name.setTextColor(context.getColor(R.color.blue))
|
||||||
|
holder.binding.desc.setTextColor(context.getColor(R.color.blue))
|
||||||
|
} else {
|
||||||
|
holder.binding.playingLayout.visibility = View.GONE
|
||||||
|
holder.binding.name.setTextColor(context.getColor(R.color.white))
|
||||||
|
holder.binding.desc.setTextColor(context.getColor(R.color.white_60))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
holder.itemView.setOnClickListener {
|
||||||
|
val intent = Intent(context, PlayerActivity::class.java);
|
||||||
|
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||||
|
context.startActivity(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = pdfList.size
|
||||||
|
|
||||||
|
inner class PDFViewHolder(val binding: SoundsOfAppliancesLayoutBinding) :
|
||||||
|
RecyclerView.ViewHolder(binding.root)
|
||||||
|
|
||||||
|
private var itemClickListener: OnItemClickListener? = null
|
||||||
|
|
||||||
|
fun setOnItemClickListener(listener: OnItemClickListener) {
|
||||||
|
itemClickListener = listener
|
||||||
|
}
|
||||||
|
|
||||||
|
interface OnItemClickListener {
|
||||||
|
fun onItemClick(position: Int)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -10,17 +10,17 @@ import com.offline.music.task.player.ProApp
|
|||||||
import com.offline.music.task.player.R
|
import com.offline.music.task.player.R
|
||||||
import com.offline.music.task.player.databinding.ParentsVoiceLayoutBinding
|
import com.offline.music.task.player.databinding.ParentsVoiceLayoutBinding
|
||||||
import com.offline.music.task.player.db.bean.Audio
|
import com.offline.music.task.player.db.bean.Audio
|
||||||
import com.offline.music.task.player.tools.containsContent
|
import com.offline.music.task.player.tools.util.containsContent
|
||||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
import com.offline.music.task.player.tools.util.convertMillisToMinutesAndSecondsString
|
||||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
import com.offline.music.task.player.tools.util.getAudioDurationFromAssets
|
||||||
import com.offline.music.task.player.ui.activity.PlayDetailsActivity
|
import com.offline.music.task.player.ui.activity.PlayerActivity
|
||||||
|
|
||||||
//LOGO
|
//LOGO
|
||||||
class ParentsVoiceAdapter(
|
class MeLocalSongAdapter(
|
||||||
private val context: Context,
|
private val context: Context,
|
||||||
private val pdfList: List<Audio>,
|
private val pdfList: List<Audio>,
|
||||||
) :
|
) :
|
||||||
RecyclerView.Adapter<ParentsVoiceAdapter.ViewHolder>() {
|
RecyclerView.Adapter<MeLocalSongAdapter.ViewHolder>() {
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
val binding = ParentsVoiceLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
val binding = ParentsVoiceLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
||||||
@ -31,8 +31,8 @@ class ParentsVoiceAdapter(
|
|||||||
val audio = pdfList[position]
|
val audio = pdfList[position]
|
||||||
holder.bind(audio)
|
holder.bind(audio)
|
||||||
holder.itemView.setOnClickListener {
|
holder.itemView.setOnClickListener {
|
||||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
val intent = Intent(context, PlayerActivity::class.java);
|
||||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
intent.putExtra(PlayerActivity.KEY_DETAILS_AUDIO, audio)
|
||||||
context.startActivity(intent)
|
context.startActivity(intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1,79 +0,0 @@
|
|||||||
package com.offline.music.task.player.ui.adapter
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import com.offline.music.task.player.ProApp
|
|
||||||
import com.offline.music.task.player.R
|
|
||||||
import com.offline.music.task.player.databinding.SoundsOfAppliancesLayoutBinding
|
|
||||||
import com.offline.music.task.player.db.bean.Audio
|
|
||||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
|
||||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
|
||||||
import com.offline.music.task.player.ui.activity.PlayDetailsActivity
|
|
||||||
|
|
||||||
class SoundsOfAppliancesAdapter(
|
|
||||||
private val context: Context,
|
|
||||||
private val pdfList: List<Audio>,
|
|
||||||
) :
|
|
||||||
RecyclerView.Adapter<SoundsOfAppliancesAdapter.PDFViewHolder>() {
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
|
||||||
val binding =
|
|
||||||
SoundsOfAppliancesLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
|
||||||
return PDFViewHolder(binding)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: PDFViewHolder, position: Int) {
|
|
||||||
val audio = pdfList[position]
|
|
||||||
holder.bind(audio)
|
|
||||||
holder.itemView.setOnClickListener {
|
|
||||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
|
||||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
|
||||||
context.startActivity(intent)
|
|
||||||
// mediaPlayer.setDataSource(this, Uri.parse("file:///android_asset/${audio.file}"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemCount(): Int = pdfList.size
|
|
||||||
|
|
||||||
inner class PDFViewHolder(private val binding: SoundsOfAppliancesLayoutBinding) :
|
|
||||||
RecyclerView.ViewHolder(binding.root) {
|
|
||||||
|
|
||||||
fun bind(audio: Audio) {
|
|
||||||
binding.apply {
|
|
||||||
Glide.with(context)
|
|
||||||
.load("file:///android_asset/${audio.image}")
|
|
||||||
.into(image)
|
|
||||||
name.text = audio.name
|
|
||||||
val s = getAudioDurationFromAssets(context, audio.file)
|
|
||||||
desc.text = convertMillisToMinutesAndSecondsString(s)
|
|
||||||
|
|
||||||
if (ProApp.currentPlayingAudio != null) {
|
|
||||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
|
||||||
playingLayout.visibility = View.VISIBLE
|
|
||||||
name.setTextColor(context.getColor(R.color.blue))
|
|
||||||
desc.setTextColor(context.getColor(R.color.blue))
|
|
||||||
} else {
|
|
||||||
playingLayout.visibility = View.GONE
|
|
||||||
name.setTextColor(context.getColor(R.color.white))
|
|
||||||
desc.setTextColor(context.getColor(R.color.white_60))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var itemClickListener: OnItemClickListener? = null
|
|
||||||
|
|
||||||
fun setOnItemClickListener(listener: OnItemClickListener) {
|
|
||||||
itemClickListener = listener
|
|
||||||
}
|
|
||||||
|
|
||||||
interface OnItemClickListener {
|
|
||||||
fun onItemClick(position: Int)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,80 +0,0 @@
|
|||||||
package com.offline.music.task.player.ui.adapter
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import com.bumptech.glide.Glide
|
|
||||||
import com.offline.music.task.player.ProApp
|
|
||||||
import com.offline.music.task.player.R
|
|
||||||
import com.offline.music.task.player.databinding.SoundsOfNatureLayoutBinding
|
|
||||||
import com.offline.music.task.player.db.bean.Audio
|
|
||||||
import com.offline.music.task.player.tools.convertMillisToMinutesAndSecondsString
|
|
||||||
import com.offline.music.task.player.tools.getAudioDurationFromAssets
|
|
||||||
import com.offline.music.task.player.ui.activity.PlayDetailsActivity
|
|
||||||
|
|
||||||
|
|
||||||
class SoundsOfNatureAdapter(
|
|
||||||
private val context: Context,
|
|
||||||
private val pdfList: List<Audio>,
|
|
||||||
) :
|
|
||||||
RecyclerView.Adapter<SoundsOfNatureAdapter.PDFViewHolder>() {
|
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PDFViewHolder {
|
|
||||||
val binding =
|
|
||||||
SoundsOfNatureLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
|
|
||||||
return PDFViewHolder(binding)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBindViewHolder(holder: PDFViewHolder, position: Int) {
|
|
||||||
val audio = pdfList[position]
|
|
||||||
holder.bind(audio)
|
|
||||||
holder.itemView.setOnClickListener {
|
|
||||||
val intent = Intent(context, PlayDetailsActivity::class.java);
|
|
||||||
intent.putExtra(PlayDetailsActivity.KEY_DETAILS_AUDIO, audio)
|
|
||||||
context.startActivity(intent)
|
|
||||||
// mediaPlayer.setDataSource(this, Uri.parse("file:///android_asset/${audio.file}"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getItemCount(): Int = pdfList.size
|
|
||||||
|
|
||||||
inner class PDFViewHolder(private val binding: SoundsOfNatureLayoutBinding) :
|
|
||||||
RecyclerView.ViewHolder(binding.root) {
|
|
||||||
|
|
||||||
fun bind(audio: Audio) {
|
|
||||||
binding.apply {
|
|
||||||
Glide.with(context)
|
|
||||||
.load("file:///android_asset/${audio.image}")
|
|
||||||
.into(image)
|
|
||||||
name.text = audio.name
|
|
||||||
val s = getAudioDurationFromAssets(context, audio.file)
|
|
||||||
desc.text = convertMillisToMinutesAndSecondsString(s)
|
|
||||||
|
|
||||||
if (ProApp.currentPlayingAudio != null) {
|
|
||||||
if (ProApp.currentPlayingAudio?.file == audio.file) {
|
|
||||||
playingLayout.visibility = View.VISIBLE
|
|
||||||
name.setTextColor(context.getColor(R.color.blue))
|
|
||||||
desc.setTextColor(context.getColor(R.color.blue))
|
|
||||||
} else {
|
|
||||||
playingLayout.visibility = View.GONE
|
|
||||||
name.setTextColor(context.getColor(R.color.white))
|
|
||||||
desc.setTextColor(context.getColor(R.color.white_60))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private var itemClickListener: OnItemClickListener? = null
|
|
||||||
|
|
||||||
fun setOnItemClickListener(listener: OnItemClickListener) {
|
|
||||||
itemClickListener = listener
|
|
||||||
}
|
|
||||||
|
|
||||||
interface OnItemClickListener {
|
|
||||||
fun onItemClick(position: Int)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -11,17 +11,17 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
|||||||
import com.gyf.immersionbar.ktx.immersionBar
|
import com.gyf.immersionbar.ktx.immersionBar
|
||||||
import com.offline.music.task.player.ProApp
|
import com.offline.music.task.player.ProApp
|
||||||
import com.offline.music.task.player.databinding.FragmentHome2Binding
|
import com.offline.music.task.player.databinding.FragmentHome2Binding
|
||||||
import com.offline.music.task.player.tools.GridSpacingItemDecoration
|
import com.offline.music.task.player.tools.util.GridSpacingItemDecoration
|
||||||
import com.offline.music.task.player.tools.HorizontalSpaceItemDecoration
|
import com.offline.music.task.player.tools.util.HorizontalSpaceItemDecoration
|
||||||
import com.offline.music.task.player.ui.adapter.RealHumanVoiceAdapter
|
import com.offline.music.task.player.ui.adapter.HomeRecommendAdapter
|
||||||
import com.offline.music.task.player.ui.adapter.SoundsOfAppliancesAdapter
|
import com.offline.music.task.player.ui.adapter.HomeWhiteNoiseAdapter
|
||||||
import com.offline.music.task.player.ui.adapter.SoundsOfNatureAdapter
|
import com.offline.music.task.player.ui.adapter.HomeVoiceOfNatureAdapter
|
||||||
|
|
||||||
class HomeFragment : Fragment() {
|
class HomeFragment : Fragment() {
|
||||||
private lateinit var binding: FragmentHome2Binding
|
private lateinit var binding: FragmentHome2Binding
|
||||||
private var realHumanVoiceAdapter: RealHumanVoiceAdapter? = null
|
private var homeRecommendAdapter: HomeRecommendAdapter? = null
|
||||||
private var soundsOfAppliancesAdapter: SoundsOfAppliancesAdapter? = null
|
private var homeWhiteNoiseAdapter: HomeWhiteNoiseAdapter? = null
|
||||||
private var soundsOfNatureAdapter: SoundsOfNatureAdapter? = null
|
private var homeVoiceOfNatureAdapter: HomeVoiceOfNatureAdapter? = null
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup?,
|
container: ViewGroup?,
|
||||||
@ -53,27 +53,27 @@ class HomeFragment : Fragment() {
|
|||||||
|
|
||||||
private fun initData(){
|
private fun initData(){
|
||||||
if (ProApp.realHumanVoiceList.isNotEmpty()) {
|
if (ProApp.realHumanVoiceList.isNotEmpty()) {
|
||||||
realHumanVoiceAdapter = RealHumanVoiceAdapter(requireActivity(), ProApp.realHumanVoiceList)
|
homeRecommendAdapter = HomeRecommendAdapter(requireActivity(), ProApp.realHumanVoiceList)
|
||||||
binding.realRv.layoutManager =
|
binding.realRv.layoutManager =
|
||||||
LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)
|
LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)
|
||||||
binding.realRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity()))
|
binding.realRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity()))
|
||||||
binding.realRv.adapter = realHumanVoiceAdapter
|
binding.realRv.adapter = homeRecommendAdapter
|
||||||
}
|
}
|
||||||
if (ProApp.soundsOfAppliancesList.isNotEmpty()) {
|
if (ProApp.soundsOfAppliancesList.isNotEmpty()) {
|
||||||
soundsOfAppliancesAdapter =
|
homeWhiteNoiseAdapter =
|
||||||
SoundsOfAppliancesAdapter(requireActivity(), ProApp.soundsOfAppliancesList)
|
HomeWhiteNoiseAdapter(requireActivity(), ProApp.soundsOfAppliancesList)
|
||||||
binding.soundsRv.layoutManager =
|
binding.soundsRv.layoutManager =
|
||||||
LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)
|
LinearLayoutManager(requireActivity(), LinearLayoutManager.HORIZONTAL, false)
|
||||||
binding.soundsRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity()))
|
binding.soundsRv.addItemDecoration(HorizontalSpaceItemDecoration(requireActivity()))
|
||||||
binding.soundsRv.adapter = soundsOfAppliancesAdapter
|
binding.soundsRv.adapter = homeWhiteNoiseAdapter
|
||||||
}
|
}
|
||||||
if (ProApp.soundsOfNatureList.isNotEmpty()) {
|
if (ProApp.soundsOfNatureList.isNotEmpty()) {
|
||||||
soundsOfNatureAdapter =
|
homeVoiceOfNatureAdapter =
|
||||||
SoundsOfNatureAdapter(requireActivity(), ProApp.soundsOfNatureList)
|
HomeVoiceOfNatureAdapter(requireActivity(), ProApp.soundsOfNatureList)
|
||||||
binding.natureRv.layoutManager =
|
binding.natureRv.layoutManager =
|
||||||
GridLayoutManager(requireActivity(), 3, GridLayoutManager.HORIZONTAL, false)
|
GridLayoutManager(requireActivity(), 3, GridLayoutManager.HORIZONTAL, false)
|
||||||
binding.natureRv.addItemDecoration(GridSpacingItemDecoration(requireActivity(), 10, 3))
|
binding.natureRv.addItemDecoration(GridSpacingItemDecoration(requireActivity(), 10, 3))
|
||||||
binding.natureRv.adapter = soundsOfNatureAdapter
|
binding.natureRv.adapter = homeVoiceOfNatureAdapter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,9 +118,9 @@ class HomeFragment : Fragment() {
|
|||||||
|
|
||||||
@SuppressLint("NotifyDataSetChanged")
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
private fun notifyDataSetChanged(){
|
private fun notifyDataSetChanged(){
|
||||||
soundsOfAppliancesAdapter?.notifyDataSetChanged()
|
homeWhiteNoiseAdapter?.notifyDataSetChanged()
|
||||||
realHumanVoiceAdapter?.notifyDataSetChanged()
|
homeRecommendAdapter?.notifyDataSetChanged()
|
||||||
soundsOfNatureAdapter?.notifyDataSetChanged()
|
homeVoiceOfNatureAdapter?.notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -24,7 +24,7 @@ import com.offline.music.task.player.ProApp
|
|||||||
import com.offline.music.task.player.R
|
import com.offline.music.task.player.R
|
||||||
import com.offline.music.task.player.databinding.FragmentMeBinding
|
import com.offline.music.task.player.databinding.FragmentMeBinding
|
||||||
import com.offline.music.task.player.db.bean.Audio
|
import com.offline.music.task.player.db.bean.Audio
|
||||||
import com.offline.music.task.player.ui.adapter.ParentsVoiceAdapter
|
import com.offline.music.task.player.ui.adapter.MeLocalSongAdapter
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@ -32,7 +32,7 @@ import kotlinx.coroutines.withContext
|
|||||||
|
|
||||||
class MeFragment : Fragment() {
|
class MeFragment : Fragment() {
|
||||||
private lateinit var binding: FragmentMeBinding
|
private lateinit var binding: FragmentMeBinding
|
||||||
private var parentsVoiceAdapter: ParentsVoiceAdapter? = null
|
private var meLocalSongAdapter: MeLocalSongAdapter? = null
|
||||||
private var importAdapterList: MutableList<Audio> = mutableListOf()
|
private var importAdapterList: MutableList<Audio> = mutableListOf()
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
@ -57,10 +57,10 @@ class MeFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
importAdapterList.clear()
|
importAdapterList.clear()
|
||||||
importAdapterList.addAll(ProApp.importList)
|
importAdapterList.addAll(ProApp.importList)
|
||||||
parentsVoiceAdapter = ParentsVoiceAdapter(requireActivity(), importAdapterList)
|
meLocalSongAdapter = MeLocalSongAdapter(requireActivity(), importAdapterList)
|
||||||
binding.importRv.layoutManager =
|
binding.importRv.layoutManager =
|
||||||
LinearLayoutManager(requireActivity(), LinearLayoutManager.VERTICAL, false)
|
LinearLayoutManager(requireActivity(), LinearLayoutManager.VERTICAL, false)
|
||||||
binding.importRv.adapter = parentsVoiceAdapter
|
binding.importRv.adapter = meLocalSongAdapter
|
||||||
}
|
}
|
||||||
|
|
||||||
private var requestPermissionLauncher =
|
private var requestPermissionLauncher =
|
||||||
@ -108,7 +108,7 @@ class MeFragment : Fragment() {
|
|||||||
importAdapterList.addAll(ProApp.importList)
|
importAdapterList.addAll(ProApp.importList)
|
||||||
for ((index, audio) in importAdapterList.withIndex()) {
|
for ((index, audio) in importAdapterList.withIndex()) {
|
||||||
if (audio.file == ProApp.currentPlayingAudio?.file) {
|
if (audio.file == ProApp.currentPlayingAudio?.file) {
|
||||||
parentsVoiceAdapter?.notifyDataSetChanged()
|
meLocalSongAdapter?.notifyDataSetChanged()
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -195,7 +195,7 @@ class MeFragment : Fragment() {
|
|||||||
ProApp.initImportAudio {
|
ProApp.initImportAudio {
|
||||||
importAdapterList.clear()
|
importAdapterList.clear()
|
||||||
importAdapterList.addAll(ProApp.importList)
|
importAdapterList.addAll(ProApp.importList)
|
||||||
parentsVoiceAdapter?.notifyDataSetChanged()
|
meLocalSongAdapter?.notifyDataSetChanged()
|
||||||
if (importAdapterList.isNotEmpty()) {
|
if (importAdapterList.isNotEmpty()) {
|
||||||
binding.noContentLayout.visibility = View.GONE
|
binding.noContentLayout.visibility = View.GONE
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -9,13 +9,13 @@ import androidx.fragment.app.Fragment
|
|||||||
import com.gyf.immersionbar.ktx.immersionBar
|
import com.gyf.immersionbar.ktx.immersionBar
|
||||||
import com.offline.music.task.player.R
|
import com.offline.music.task.player.R
|
||||||
import com.offline.music.task.player.databinding.FragmentSettingBinding
|
import com.offline.music.task.player.databinding.FragmentSettingBinding
|
||||||
import com.offline.music.task.player.tools.EMAIL
|
import com.offline.music.task.player.tools.util.EMAIL
|
||||||
import com.offline.music.task.player.tools.PRIVACY_POLICY_URL
|
import com.offline.music.task.player.tools.util.PRIVACY_POLICY_URL
|
||||||
import com.offline.music.task.player.tools.TERMS_OF_SERVICE_URL
|
import com.offline.music.task.player.tools.util.TERMS_OF_SERVICE_URL
|
||||||
import com.offline.music.task.player.tools.openPrivacyPolicy
|
import com.offline.music.task.player.tools.util.openPrivacyPolicy
|
||||||
import com.offline.music.task.player.tools.openTermsOfService
|
import com.offline.music.task.player.tools.util.openTermsOfService
|
||||||
import com.offline.music.task.player.tools.sendFeedback
|
import com.offline.music.task.player.tools.util.sendFeedback
|
||||||
import com.offline.music.task.player.tools.shareApp
|
import com.offline.music.task.player.tools.util.shareApp
|
||||||
import com.offline.music.task.player.ui.activity.AboutActivity
|
import com.offline.music.task.player.ui.activity.AboutActivity
|
||||||
|
|
||||||
class SettingsFragment : Fragment() {
|
class SettingsFragment : Fragment() {
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import android.renderscript.*
|
|||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
|
|
||||||
class BlurLayout : FrameLayout {
|
class BlurLayoutView : FrameLayout {
|
||||||
private var blurRadius = 25f // 默认模糊半径
|
private var blurRadius = 25f // 默认模糊半径
|
||||||
private val cornerRadius = dpToPx(18) // 圆角半径
|
private val cornerRadius = dpToPx(18) // 圆角半径
|
||||||
constructor(context: Context) : super(context)
|
constructor(context: Context) : super(context)
|
||||||
@ -1,62 +0,0 @@
|
|||||||
package com.offline.music.task.player.ui.view
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.graphics.LinearGradient
|
|
||||||
import android.graphics.Paint
|
|
||||||
import android.graphics.RectF
|
|
||||||
import android.graphics.Shader
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.view.View
|
|
||||||
|
|
||||||
class CustomProgressBar(context: Context, attrs: AttributeSet?) : View(context, attrs) {
|
|
||||||
private var progress = 0 // 当前进度
|
|
||||||
private val maxProgress = 100 // 最大进度
|
|
||||||
private val progressBarHeight = 20f // 进度条高度
|
|
||||||
private val cornerRadius = 10f // 圆角半径
|
|
||||||
private val backgroundColor = Color.parseColor("#26FFFFFF")
|
|
||||||
private val startColor = Color.parseColor("#FF1CC8EE") // 起始颜色
|
|
||||||
private val middleColor = Color.parseColor("#FF69FE73") // 中间颜色
|
|
||||||
private val endColor = Color.parseColor("#FFCBD64B") // 结束颜色
|
|
||||||
private val paint = Paint()
|
|
||||||
private val paintTow = Paint()
|
|
||||||
|
|
||||||
init {
|
|
||||||
paint.style = Paint.Style.FILL
|
|
||||||
paint.isAntiAlias = true
|
|
||||||
paintTow.style = Paint.Style.FILL
|
|
||||||
paintTow.isAntiAlias = true
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDraw(canvas: Canvas) {
|
|
||||||
super.onDraw(canvas)
|
|
||||||
// 绘制底色矩形
|
|
||||||
paint.shader = null // 重置着色器
|
|
||||||
paint.color = backgroundColor
|
|
||||||
val backgroundRect = RectF(0f, (height / 2 - progressBarHeight / 2), width.toFloat(), (height / 2 + progressBarHeight / 2))
|
|
||||||
canvas.drawRoundRect(backgroundRect, cornerRadius, cornerRadius, paint)
|
|
||||||
|
|
||||||
|
|
||||||
// 计算进度条的宽度
|
|
||||||
val progressBarWidth = (width * progress.toFloat() / maxProgress).toInt()
|
|
||||||
|
|
||||||
// 创建颜色渐变对象
|
|
||||||
val gradient = LinearGradient(0f, 0f, width.toFloat(), 0f, intArrayOf(startColor, middleColor, endColor), null, Shader.TileMode.CLAMP)
|
|
||||||
paintTow.shader = gradient
|
|
||||||
|
|
||||||
// 绘制带圆角的进度条矩形
|
|
||||||
val rect = RectF(0f, (height / 2 - progressBarHeight / 2), progressBarWidth.toFloat(), (height / 2 + progressBarHeight / 2))
|
|
||||||
canvas.drawRoundRect(rect, cornerRadius, cornerRadius, paintTow)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getProgress():Int{
|
|
||||||
return progress
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置进度
|
|
||||||
fun setProgress(progress: Int) {
|
|
||||||
this.progress = progress
|
|
||||||
invalidate() // 请求重绘
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,52 +0,0 @@
|
|||||||
package com.offline.music.task.player.ui.view
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Canvas
|
|
||||||
import android.graphics.Color
|
|
||||||
import android.graphics.Paint
|
|
||||||
import android.graphics.PorterDuff
|
|
||||||
import android.graphics.PorterDuffXfermode
|
|
||||||
import android.graphics.Rect
|
|
||||||
import android.graphics.RectF
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.widget.RelativeLayout
|
|
||||||
|
|
||||||
class RadiusLayout : RelativeLayout {
|
|
||||||
private val cornerRadius = dpToPx(18) // 圆角半径
|
|
||||||
constructor(context: Context) : super(context)
|
|
||||||
|
|
||||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
|
|
||||||
|
|
||||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
|
|
||||||
context,
|
|
||||||
attrs,
|
|
||||||
defStyleAttr
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun dispatchDraw(canvas: Canvas) {
|
|
||||||
// 创建一个 Bitmap 用于绘制原始内容
|
|
||||||
val originalBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
|
|
||||||
val originalCanvas = Canvas(originalBitmap)
|
|
||||||
// 调用父类的 dispatchDraw() 方法,把所有的子 View 绘制到这个 Bitmap 上
|
|
||||||
super.dispatchDraw(originalCanvas)
|
|
||||||
// 绘制原始内容
|
|
||||||
canvas.drawBitmap(originalBitmap, 0f, 0f, null)
|
|
||||||
// 创建一个画笔
|
|
||||||
val paint = Paint()
|
|
||||||
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)
|
|
||||||
|
|
||||||
// 定义整个布局的矩形区域
|
|
||||||
val layoutRect = Rect(0, 0, width, height)
|
|
||||||
val rectF = RectF(layoutRect)
|
|
||||||
// 绘制具有圆角的矩形作为背景
|
|
||||||
paint.color = Color.parseColor("#CCffffff") // 半透明黑色
|
|
||||||
paint.isAntiAlias = true
|
|
||||||
canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun dpToPx(dp: Int): Float {
|
|
||||||
val density = resources.displayMetrics.density
|
|
||||||
return (dp * density)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -5,7 +5,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:background="@color/white"
|
android:background="@color/white"
|
||||||
tools:context=".ui.activity.LaunchActivity">
|
tools:context=".ui.activity.SplashActivity">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
android:layout_width="166dp"
|
android:layout_width="166dp"
|
||||||
android:layout_height="140dp">
|
android:layout_height="140dp">
|
||||||
|
|
||||||
<com.offline.music.task.player.ui.view.BlurLayout
|
<com.offline.music.task.player.ui.view.BlurLayoutView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
@ -18,7 +18,7 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:scaleType="centerCrop" />
|
android:scaleType="centerCrop" />
|
||||||
|
|
||||||
</com.offline.music.task.player.ui.view.BlurLayout>
|
</com.offline.music.task.player.ui.view.BlurLayoutView>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user