-
大小: 33KB文件类型: .java金币: 1下载: 0 次发布日期: 2023-04-09
- 语言: Java
- 标签: SeekBarVolum SeekBar Android
资源简介
修复了Settings中音量设置的音量条存在回弹、显示的位置和实际数值不一致等问题。
代码片段和文件信息
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License Version 2.0 (the “License“);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing software
* distributed under the License is distributed on an “AS IS“ BASIS
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.preference;
import android.annotation.UnsupportedAppUsage;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.preference.VolumePreference.VolumeStore;
import android.provider.Settings;
import android.provider.Settings.Global;
import android.provider.Settings.System;
import android.service.notification.ZenModeConfig;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import com.android.internal.annotations.GuardedBy;
/**
* 这个类用于供SeekBar设置音量使用,与SeekBar绑定,可以收一个使用者传入的回调接口SeekBarVolumizer.CallBack。
* 当音量更改时该类会开始播放音乐,但是需要注意该类不会自动停止音乐的播放,因此需要该类的使用者在CallBack的onSampleStarting中,自己定义何时停止音乐播放,停止音乐播放需要调用该类的stopSample方法
* 1、当进度条发生改变时,SeekBar的回调会触发CallBack的onProgressChange方法并将SeekBar的最新值更新到mLastProgress中,并构建一个VOLUME_SET通知后台线程去将该值存储到AudioManger中。
* 2、后台线程更新完这个值后,AudioManager会发送一个广播通知音量已更改
* 3、该类注册了一个广播接收器来监听音量更改事件,当音量发生更改时,该接收器在广播中取出音量值和音量类型,然后判断音量类型是否与当前类符合,如果符合则使用将当前音量更新mLastProgress,并通知Ui线程更新SeekBar
*
* 所以问题出现在第3点处,主要问题有两点:
* 1、mLastProgress这个变量起了两个作用,第一个记录最新的SeekBar的值,第二个是记录广播发过来的值。
* 因为广播是滞后于滑动的,比如从右向左滑动,则mLastProgress依次被记录为7654321,正常情况下最后存入的值为最后一个1;
* 假设最后当该存入1时,因为执行顺序的原因,导致广播接收器的行为将这个1修改为了2,那么此时就会导致1因为丢失无法存入。
*
* 这个导致了问题进度条和实际音量不相符的现象:即当进度条滑到0时,没有静音;或者当进度条滑到1时,依然静音。
*
* 为了实现最小改动,该问题拟通过增加一个mCurrentProgress变量来进行处理,即将mLastProgress的作用集中,mLastProgress只负责记录最近的音量大小,即AudioManger发送过过来的音量大小,
* mCurrentProgress记录SeekBar的当前位置,并将该值存入AudioManger中完成铃声设置。
* 2、setProgress(int true)方法,该方法true表示使用动画来实现SeekBar的值过渡,该动画会造成onProgressChanged上报的值与自身实际位置不符
*
* 3、多个SeekBar同时滑动是因为AudioManager发生错误导致发出了多个不同StreamType类型的广播,引起了其它进度条的更新
*
* 通过直接判断广播发送的StreamType与当前实例的mStreamType是否一致来修复该问题。
* Turns a {@link SeekBar} into a volume control.
* @hide
*/
public class SeekBarVolumizer implements OnSeekBarChangeListener Handler.Callback {
pri
相关资源
- android带百分比进度条的文件上传,使
- 美食天下项目Android版源码和Web版源码
- Android之自定义ToggleButton使用
- Android非常漂亮的登录界面
- pc与android通过usb socket实现手机通信
- android毕业设计
- 百度地图自定义Markerandroid
- Android分区工具包
- android-support-v4.jar已打包进去源代码
- u-blox_Android_GNSS_Driver_v3.10驱动源码+中
- 个人根据Android移动开发案例详解手写
- android 视频播放器 项目和原码
- Android【动画】【特效】 17种动画特效
- 基于Android智能家居详细设计(经典)
- android通过JDBC连接Mysql数据库
- Android通讯录的源代码
- android 瀑布流Demo
- 指纹传感器FPC1080在android下的驱动
- delphi xe5 android 调用照相机摄像头拍照
- Android手机连连看游戏源码
- android-sdk-windows v2.3离线完整版
- android 底部弹出菜单(带透明背景)
- Android工程模式简介.rar
- Android蓝牙和Cors网络开发源码
- Android powermanger wakelock
- Android v7的一些jar包
- 最新android supportV7包
- android图片压缩工具类分享
- 单机搭建Android(解决Network is unreach
- Android上监听收到的短信(SMS)
评论
共有 条评论