最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

引言

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

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

全局添加按鈕

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

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

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

實(shí)現(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, "點(diǎn)擊了全局按鈕", Toast.LENGTH_SHORT).show() }
        }
        val rootView = findViewById<FrameLayout>(android.R.id.content)
        rootView.addView(controllerView)
    }
}

效果如圖:

音量控制

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

實(shí)現(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)整的實(shí)現(xiàn)方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Android 全局音量調(diào)整的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android實(shí)現(xiàn)點(diǎn)擊Button產(chǎn)生水波紋效果

    Android實(shí)現(xiàn)點(diǎn)擊Button產(chǎn)生水波紋效果

    這篇文章主要介紹了Android實(shí)現(xiàn)點(diǎn)擊Button產(chǎn)生水波紋效果,需要的朋友可以參考下
    2016-01-01
  • Android?Dispatchers.IO線程池深入刨析

    Android?Dispatchers.IO線程池深入刨析

    這篇文章主要為大家介紹了Android?Kotlin線程池Dispatchers.IO原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-08-08
  • android獲取照片的快照 思路及實(shí)現(xiàn)方法

    android獲取照片的快照 思路及實(shí)現(xiàn)方法

    android獲取照片的快照 思路及實(shí)現(xiàn)方法,需要的朋友可以參考一下
    2013-06-06
  • Android手機(jī)聯(lián)系人快速索引(手機(jī)通訊錄)

    Android手機(jī)聯(lián)系人快速索引(手機(jī)通訊錄)

    最近需要實(shí)現(xiàn)一個(gè)手機(jī)通訊錄的快速索引功能。根據(jù)姓名首字母快速索引功能,下面通過本篇文章給大家介紹Android手機(jī)聯(lián)系人快速索引(手機(jī)通訊錄)的相關(guān)代碼,需要的朋友參考下
    2015-12-12
  • Android數(shù)據(jù)庫增刪改查實(shí)戰(zhàn)案例

    Android數(shù)據(jù)庫增刪改查實(shí)戰(zhàn)案例

    我們?cè)诰幊讨薪?jīng)常會(huì)遇到數(shù)據(jù)庫的操作,這篇文章主要給大家介紹了關(guān)于Android數(shù)據(jù)庫增刪改查的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Android 遍歷文件夾中所有文件的實(shí)例代碼

    Android 遍歷文件夾中所有文件的實(shí)例代碼

    本篇文章主要介紹了Android 遍歷文件夾中所有文件的實(shí)例代碼,可以獲得文件夾中所有文件的路徑及文件名,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-06-06
  • 深入理解Android中View繪制的三大流程

    深入理解Android中View繪制的三大流程

    這篇文章主要給大家介紹了關(guān)于Android中View繪制的三大流程,View的工作流程主要是指measure、layout、draw這三大流程,即測(cè)量、布局和繪制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • Android 操作系統(tǒng)獲取Root權(quán)限 原理詳細(xì)解析

    Android 操作系統(tǒng)獲取Root權(quán)限 原理詳細(xì)解析

    許多機(jī)友新購(gòu)來的Android機(jī)器沒有破解過Root權(quán)限,無法使用一些需要高權(quán)限的軟件,以及進(jìn)行一些高權(quán)限的操作,其實(shí)破解手機(jī)Root權(quán)限是比較簡(jiǎn)單及安全的,破解Root權(quán)限的原理就是在手機(jī)的/system/bin/或/system/xbin/目錄下放置一個(gè)可執(zhí)行文件“su”
    2013-10-10
  • Android實(shí)現(xiàn)socket通信統(tǒng)一接口的方法

    Android實(shí)現(xiàn)socket通信統(tǒng)一接口的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)socket通信統(tǒng)一接口?,實(shí)現(xiàn)了統(tǒng)一接口之后確實(shí)可以使后續(xù)修改實(shí)現(xiàn)更加方便,程序結(jié)構(gòu)也更加工程化,需要的朋友可以參考下
    2021-12-12
  • android 仿微信demo——微信通訊錄界面功能實(shí)現(xiàn)(移動(dòng)端,服務(wù)端)

    android 仿微信demo——微信通訊錄界面功能實(shí)現(xiàn)(移動(dòng)端,服務(wù)端)

    本系列文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望能給你們提供幫助
    2021-06-06

最新評(píng)論

华坪县| 德州市| 山西省| 利辛县| 武鸣县| 中超| 新泰市| 芷江| 凤台县| 淮阳县| 尤溪县| 天镇县| 武功县| 浏阳市| 通州市| 孟连| 红桥区| 五指山市| 绥宁县| 磐石市| 东光县| 扎鲁特旗| 铁岭县| 阿拉善左旗| 浦江县| 弥渡县| 东明县| 湖州市| 黄山市| 收藏| 卓尼县| 抚远县| 满洲里市| 永州市| 富川| 墨玉县| 白水县| 花莲市| 嘉黎县| 常熟市| 广饶县|