欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)全局音量調(diào)整的實現(xiàn)方式詳解

 更新時間:2022年11月27日 16:19:37   作者:ChenYhong  
這篇文章主要為大家介紹了Android開發(fā)全局音量調(diào)整的實現(xiàn)方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

之前參與過一個項目,開發(fā)的是一個系統(tǒng)級別的軟件,安裝在定制的設(shè)備上,設(shè)備沒有控制音量的按鍵,因此軟件需要實現(xiàn)一個在任意頁面都能控制音量的功能。

實現(xiàn)方案是在所有頁面的頂部加上一個觸發(fā)音量控制彈窗的按鈕,用戶點擊該按鈕后顯示音量控制彈窗。

全局添加按鈕

參與項目時,已經(jīng)出了第一版了,包含的頁面很多,因此一個個頁面去加肯定不合適。項目中所有Activity都繼承了一個自定義的BaseActivity,所以只能在這個BaseActivity中做文章。

Android中,每個Activity都包含一個DecorView,DecorView內(nèi)部包含一個FrameLayout,可以通過android.R.id.content來獲取,我們的布局包含在這個FrameLayout中。

因此如果需要在所有的頁面都添加View,那么在BaseActivity中實現(xiàn)向android.R.id.content對應(yīng)的FrameLayout添加View的邏輯,然后所有的Activity就都可以自動添加View了。

實現(xiàn)代碼如下:

object DensityUtil {
    @JvmStatic
    fun dp2Px(dpValue: Int): Int {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue.toFloat(), Resources.getSystem().displayMetrics).toInt()
    }
    @JvmStatic
    fun px2Dp(pxValue: Int): Int {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, pxValue.toFloat(), Resources.getSystem().displayMetrics).toInt()
    }
}
// Base類
open class BaseActivity : AppCompatActivity() {
    override fun onResume() {
        super.onResume()
        // 在onResume中添加,確保在主布局添加完成后添加,避免被遮擋。
        initVolumeControllerView()
    }
    private fun initVolumeControllerView() {
        val controllerView = AppCompatImageView(this)
        controllerView.layoutParams = FrameLayout.LayoutParams(DensityUtil.dp2Px(80), DensityUtil.dp2Px(12)).apply {
            gravity = Gravity.START
            marginStart = DensityUtil.dp2Px(20)
            topMargin = DensityUtil.dp2Px(10)
        }
        controllerView.setImageResource(R.drawable.shape_vollume_controller)
        controllerView.setOnClickListener {
            runOnUiThread { Toast.makeText(this, "點擊了全局按鈕", Toast.LENGTH_SHORT).show() }
        }
        val rootView = findViewById<FrameLayout>(android.R.id.content)
        rootView.addView(controllerView)
    }
}

效果如圖:

音量控制

AudioManager類提供了控制音量的方法。

實現(xiàn)音量控制代碼如下:

class VolumeControllerDialog : DialogFragment() {
    private var binding: LayoutVolumeContollerDialogBinding? = null
    private var currentVolume = 0
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        dialog?.window?.run {
            setBackgroundDrawable(ContextCompat.getDrawable(requireContext(), android.R.color.transparent))
            decorView.setBackgroundResource(android.R.color.transparent)
            val layoutParams = attributes
            layoutParams.width = DensityUtil.dp2Px(360)
            layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT
            layoutParams.gravity = Gravity.CENTER
            attributes = layoutParams
        }
        binding = DataBindingUtil.inflate(inflater, R.layout.layout_volume_contoller_dialog, container, false)
        return binding?.root
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val audioManager = requireContext().getSystemService(Context.AUDIO_SERVICE) as AudioManager
        currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
        val step = 1
        binding?.run {
            btnMute.text = getMuteButtonString(audioManager.isStreamMute(AudioManager.STREAM_MUSIC))
            btnIncreaseVolume.setOnClickListener {
                // 增加音量
                currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume + step, AudioManager.FLAG_SHOW_UI or AudioManager.FLAG_PLAY_SOUND)
                btnMute.text = getMuteButtonString(audioManager.isStreamMute(AudioManager.STREAM_MUSIC))
            }
            btnReduceVolume.setOnClickListener {
                //減少音量
                currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, if (currentVolume - step < 0) 0 else currentVolume - step, AudioManager.FLAG_SHOW_UI or AudioManager.FLAG_PLAY_SOUND)
                btnMute.text = getMuteButtonString(audioManager.isStreamMute(AudioManager.STREAM_MUSIC))
            }
            btnMute.setOnClickListener {
                // 靜音或取消靜音
                val currentMute = audioManager.isStreamMute(AudioManager.STREAM_MUSIC)
                if (currentVolume == 0) {
                    btnMute.text = getMuteButtonString(true)
                } else {
                    btnMute.text = getMuteButtonString(!currentMute)
                }
                val setVolume = if (currentMute) {
                    currentVolume
                } else {
                    currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
                    0
                }
                audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, setVolume, AudioManager.FLAG_SHOW_UI or AudioManager.FLAG_PLAY_SOUND)
            }
        }
    }
    private fun getMuteButtonString(mute: Boolean): String {
        return if (mute) "UnMute" else "Mute"
    }
}
open class BaseActivity : AppCompatActivity() {
    override fun onResume() {
        super.onResume()
        // 在onResume中添加,確保在主布局添加完成后添加,避免被遮擋。
        initVolumeControllerView()
    }
    private fun initVolumeControllerView() {
        val controllerView = AppCompatImageView(this)
        controllerView.layoutParams = FrameLayout.LayoutParams(DensityUtil.dp2Px(80), DensityUtil.dp2Px(12)).apply {
            gravity = Gravity.START
            marginStart = DensityUtil.dp2Px(20)
            topMargin = DensityUtil.dp2Px(10)
        }
        controllerView.setImageResource(R.drawable.shape_vollume_controller)
        controllerView.setOnClickListener {
            VolumeControllerDialog().show(supportFragmentManager, null)
        }
        val rootView = findViewById<FrameLayout>(android.R.id.content)
        rootView.addView(controllerView)
    }
}

效果如圖:

以上就是Android開發(fā)全局音量調(diào)整的實現(xiàn)方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Android 全局音量調(diào)整的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android ViewPager源碼詳細(xì)分析

    Android ViewPager源碼詳細(xì)分析

    這篇文章主要為大家詳細(xì)介紹了Android ViewPager源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android 控制車載藍(lán)牙播放音樂詳解流程

    Android 控制車載藍(lán)牙播放音樂詳解流程

    本篇文章介紹了手機(jī)端音樂暫停和播放狀態(tài),從服務(wù)端告訴客戶端、設(shè)備端實現(xiàn)暫停、播放、上一首、下一首等功能的實現(xiàn),通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-10-10
  • Android制作登錄頁面并且記住賬號密碼功能的實現(xiàn)代碼

    Android制作登錄頁面并且記住賬號密碼功能的實現(xiàn)代碼

    這篇文章主要介紹了Android制作登錄頁面并且記住賬號密碼功能的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • 詳解Android啟動第一幀

    詳解Android啟動第一幀

    這篇文章我們就來介紹Android啟動第一幀,至于Android第一幀什么時候開始調(diào)度,具體內(nèi)容我們就來看下面文章內(nèi)容吧,感興趣得小伙伴可以和小編一起來學(xué)習(xí)奧
    2021-10-10
  • Android webview加載https鏈接錯誤或無響應(yīng)的解決

    Android webview加載https鏈接錯誤或無響應(yīng)的解決

    這篇文章主要介紹了Android webview加載https鏈接錯誤或無響應(yīng)的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android使用DatePickerDialog顯示時間

    Android使用DatePickerDialog顯示時間

    本文將結(jié)合實例代碼,介紹Android使用DatePickerDialog顯示時間,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Android利用Intent實現(xiàn)記事本功能(NotePad)

    Android利用Intent實現(xiàn)記事本功能(NotePad)

    這篇文章主要為大家詳細(xì)介紹了Android利用Intent實現(xiàn)簡單記事本功能(NotePad)的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android?TextView的maxEms和maxLength屬性區(qū)別

    Android?TextView的maxEms和maxLength屬性區(qū)別

    這篇文章主要為大家介紹了Android?TextView的maxEms和maxLength屬性區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 解決Kotlin 類在實現(xiàn)多個接口,覆寫多個接口中相同方法沖突的問題

    解決Kotlin 類在實現(xiàn)多個接口,覆寫多個接口中相同方法沖突的問題

    這篇文章主要介紹了解決Kotlin 類在實現(xiàn)多個接口,覆寫多個接口中相同方法沖突的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android開發(fā)手冊TextView屬性實現(xiàn)效果盤點

    Android開發(fā)手冊TextView屬性實現(xiàn)效果盤點

    這篇文章主要為大家介紹了Android開發(fā)手冊TextView屬性實現(xiàn)的效果盤點及使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評論