Android 自定义SeekBar动态改变 硬件音量大小 实现和音量键的同步

1,上图:

2,代码:

MainActivity.java

package com.hero.zhaoq.seekbarchangeddemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.media.AudioManager;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.SeekBar;

/**
 * Android实现  SeekBar更新音量  并实现  和硬件同步
 */
public class MainActivity extends AppCompatActivity {

    private SeekBar seekbar_video;

    private ContentObserver mVoiceObserver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);//获取媒体系统服务
        seekbar_video= (SeekBar) findViewById(R.id.seekbar_video);//注册ID
        seekbar_video.setMax(15);//设置最大音量
        seekbar_video.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));// 当前的媒体音量
        myRegisterReceiver();//注册同步更新的广播

        Log.i("lyj_ring", "mVoiceSeekBar max voluem = "+audioManager.getStreamMaxVolume(AudioManager.STREAM_SYSTEM));
        seekbar_video.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

            public void onStopTrackingTouch(SeekBar arg0) {
            }

            public void onStartTrackingTouch(SeekBar arg0) {
            }
            public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
                AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                Log.v("lyj_ring", "mVoiceSeekBar max progress = "+arg1);
                //系统音量和媒体音量同时更新
                audioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, arg1, 0);
                audioManager.setStreamVolume(3, arg1, 0);//  3 代表  AudioManager.STREAM_MUSIC
            }
        });
        mVoiceObserver = new ContentObserver(new Handler()) {
            @Override
            public void onChange(boolean selfChange) {
                super.onChange(selfChange);
                AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                seekbar_video.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_SYSTEM));
                //或者你也可以用媒体音量来监听改变,效果都是一样的。
                //mVoiceSeekBar.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
            }
        };
    }

    private void myRegisterReceiver(){
        MyVolumeReceiver  mVolumeReceiver = new MyVolumeReceiver() ;
        IntentFilter filter = new IntentFilter() ;
        filter.addAction("android.media.VOLUME_CHANGED_ACTION") ;
        registerReceiver(mVolumeReceiver, filter) ;
    }

    /**
     * 处理音量变化时的界面显示
     * @author long
     */
    private class MyVolumeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //如果音量发生变化则更改seekbar的位置
            if(intent.getAction().equals("android.media.VOLUME_CHANGED_ACTION")){
                AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                int currVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) ;// 当前的媒体音量
                seekbar_video.setProgress(currVolume) ;
            }
        }
    }
}

main_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ringtone_seekbar_parent"
    android:layout_width="match_parent"
    android:layout_height="160px"
    android:layout_marginTop="0dip"
    android:layout_weight="1"
    android:gravity="center_vertical"
    android:orientation="horizontal" >

    <SeekBar
        android:id="@+id/seekbar_video"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:max="0"
        android:progress="0"
        android:progressDrawable="@drawable/seekbar_progress_layer_list"
        android:thumb="@mipmap/play_seekbar_icon"
        android:layout_weight="18"/>

</LinearLayout>

seekbar_progress_layer_list.xml



<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!--未选中 状态-->
    <item android:id="@android:id/background"
        android:drawable="@mipmap/volumn_bg" />

    <!--&lt;!&ndash;选中状态&ndash;&gt;-->
    <item android:id="@android:id/progress">
        <scale android:drawable="@mipmap/volumn_primary" android:scaleWidth="100%" />
    </item>

</layer-list>

不是你不会只是你不知道而已……..

整个代码实现很简单。 笔者不在赘述。

注: 打开demo,打开歌曲。滑动seekbar即可改音量大小。

maybe你更需要这个:

源码:

https://github.com/229457269/SeekBarChangedVoiceDemo

参考:http://blog.csdn.net/lyjit/article/details/51538951

时间: 2024-08-07 00:15:35

Android 自定义SeekBar动态改变 硬件音量大小 实现和音量键的同步的相关文章

分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小

原文:分享非常有用的Java程序 (关键代码)(四)---动态改变数组的大小 /** * Reallocates an array with a new size, and copies the contents * * of the old array to the new array. * * @param oldArray the old array, to be reallocated. * * @param newSize the new array size. * * @return

手机摇一摇功能音量大小跟系统音量一致

源码免费下载 布局文文件:main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent&qu

Android自定义Seekbar拖动条式样

SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性有以下一些: android:max[integer]//设置拖动条的最大值 android:progress[integer]//设置当前的进度值 android:secondaryProgress[integer]//设置第二进度,通常用做显示视频等的缓冲效果 android:thumb[dra

Android 动态改变Layout的大小

设置View的大小是通过设置LayoutParams参数. 如果一个view在一个RelativeLayout里面,需要用一个RelativeLayout.LayoutParams对象来设置 在代码里面设置的高度height是px,如果想用dp单位设置,需要获取屏幕的密度,然后转换. final float scale = getActivity().getResources().getDisplayMetrics().density; int height = (int) (48 * scal

Android 自定义Spinner字体、颜色、大小

昨天在公司项目中遇到Spinner颜色,字体,大小的困惑.所以今天也总结一下这方面知识.这个其实很简单,要改变字体,颜色以及大小,无非就是不要用系统自带的样式.自已例外写一个layout调用就行了.我就是这样做的.本文例子还有Spinner两种弹出方式,下拉框以及弹出框.加载数据源的两种方式.下面看代码介绍. 本文项目源码地址:http://download.csdn.net/detail/qq_16064871/8583085 转载请注明出处: http://blog.csdn.net/qq_

Android 自定义View——动态进度条

效果图: 这个是看了梁肖的demo,根据他的思路自己写了一个,但是我写的这个貌似计算还是有些问题,从上面的图就可以看出来,左侧.顶部.右侧的线会有被截掉的部分,有懂得希望能给说一下,改进一下,这个过程还是有点曲折的,不过还是觉得收获挺多的.比如通动画来进行动态的展示(之前做的都是通过Handler进行更新的所以现在换一种思路觉得特别好),还有圆弧的起止角度,矩形区域的计算等!关于绘制我们可以循序渐进,比如最开始先画圆,然后再画周围的线,最后设置动画部分就可以了.不多说了,上代码了. 代码 自定义

Android 自定义seekbar中,thumb被覆盖掉一部分问题

(图一)  (图二)    (图三) 做一个自定义的seekbar,更改其背景图片: <com.android.Progress android:id="@+id/focus_seekbar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/seekbar_add" and

Android代码中动态设置图片的大小(自动缩放),位置

项目中需要用到在代码中动态调整图片的位置和设置图片大小,能自动缩放图片,用ImageView控件,具体做法如下: 1.布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"

android自定义seekBar

Android原生控件只有横向进度条一种,而且没法变换样式,比如原生rom的样子 很丑是吧,当伟大的产品设计要求更换前背景,甚至纵向,甚至圆弧状的,咋办,比如 ok,我们开始吧: 一)变换前背景 先来看看progressbar的属性: <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width=&