自己写的SeekBarPreference,可以实现seekbar滑动监听和设置默认进度和最大进度

我通过参考android源码,把这个烂尾的类写完了。具体实现了seekbar的数据自动存储,seekbar拖动时触发监听器,可以设置默认的进度和最大进度。先说使用的方式:
1.在xml文件中使用preference
<com.kale.floatbar.preference.MySeekBarPreference
android:key="alpha"
android:layout="@layout/prefs_list_item"
android:title="透明度" />
2,在Java代码中找到preference然后设置数值或绑定监听器
private MySeekBarPreference alphaSb
alphaSb = (MySeekBarPreference) findPreference("alpha");//找到preference
alphaSb.setDefaultProgressValue(100);//设置起始时的进度
alphaSb.setMax(255);//设置最大的数值,不超过10000。如果超过了请在seekbarPreference源码中进行修改max值
alphaSb.setOnSeekBarPrefsChangeListener(this);//设置监听器
3.设置监听器,这里的key是当前触发监听器的preference的key,这样可以区分是哪个seekbarPreference触发的监听器
@Override
public void onStopTrackingTouch(String key, SeekBar seekBar) {
} @Override
public void onStartTrackingTouch(String key, SeekBar seekBar) {
} @Override
public void onProgressChanged(String key, SeekBar seekBar, int progress, boolean fromUser) { }
最后是SeekbarPreference的源码:
/*
* Copyright (C) 2011 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 com.kale.floatbar.preference; import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import android.preference.Preference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView; import com.kale.floatbar.R; public class MySeekBarPreference extends Preference implements OnSeekBarChangeListener{ private TextView value;
private int mProgress;
private int mMax = 10000;//如果您的seekbar最大值超过了10000,那么在这里修改下即可。否则会被限制最大值为10000
private boolean mTrackingTouch;
private OnSeekBarPrefsChangeListener mListener = null; public MySeekBarPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle); setMax(mMax);
setLayoutResource(R.layout.seekbar_prefs);
} public MySeekBarPreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public MySeekBarPreference(Context context) {
this(context, null);
} @Override
protected void onBindView(View view) {
super.onBindView(view); SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekbar);
seekBar.setMax(mMax);
seekBar.setProgress(mProgress);
seekBar.setEnabled(isEnabled());
seekBar.setOnSeekBarChangeListener(this);
value = (TextView)view.findViewById(R.id.value);
value.setText(String.valueOf(mProgress));
} /** 设置默认的值
* @param defaultValue
*/
public void setDefaultProgressValue(int defaultValue) {
if(getPersistedInt(-1) == -1) {
//说明没有用户设定的值,所以设置初始值
setProgress(defaultValue);
}
} @Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
setProgress(restoreValue ? getPersistedInt(mProgress): (Integer) defaultValue);
} public void setMax(int max) {
if (max != mMax) {
mMax = max;
notifyChanged();
}
} public void setProgress(int progress) {
setProgress(progress, true);
} private void setProgress(int progress, boolean notifyChanged) {
if (progress > mMax) {
progress = mMax;
}
if (progress < 0) {
progress = 0;
}
if (progress != mProgress) {
mProgress = progress;
persistInt(progress);
if (notifyChanged) {
notifyChanged();
}
}
} public int getProgress() {
return mProgress;
} public void setOnSeekBarPrefsChangeListener(OnSeekBarPrefsChangeListener listener) {
mListener = listener;
} /**
* @author:Jack Tony
* @tips :设置监听器
* @date :2014-8-17
*/
public interface OnSeekBarPrefsChangeListener {
//public void OnSeekBarChangeListener(SeekBar seekBar, boolean isChecked);
public void onStopTrackingTouch(String key ,SeekBar seekBar) ;
public void onStartTrackingTouch(String key ,SeekBar seekBar);
public void onProgressChanged(String key ,SeekBar seekBar, int progress,boolean fromUser);
} /**
* Persist the seekBar's progress value if callChangeListener
* returns true, otherwise set the seekBar's progress to the stored value
*/
void syncProgress(SeekBar seekBar) {
int progress = seekBar.getProgress();
if (progress != mProgress) {
if (callChangeListener(progress)) {
setProgress(progress, false);
} else {
seekBar.setProgress(mProgress);
}
}
} @Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//value.setText(seekBar.getProgress()+"");
if (mListener != null) {
mListener.onProgressChanged(getKey(),seekBar, progress, fromUser);
}
if (seekBar.getProgress() != mProgress) {
syncProgress(seekBar);
}
if (fromUser && !mTrackingTouch) {
syncProgress(seekBar);
}
} @Override
public void onStartTrackingTouch(SeekBar seekBar) {
if (mListener != null) {
mListener.onStartTrackingTouch(getKey(),seekBar);
}
mTrackingTouch = true;
} @Override
public void onStopTrackingTouch(SeekBar seekBar) {
if (mListener != null) {
mListener.onStopTrackingTouch(getKey(),seekBar);
}
mTrackingTouch = false;
if (seekBar.getProgress() != mProgress) {
syncProgress(seekBar);
}
notifyHierarchyChanged();
} @Override
protected Parcelable onSaveInstanceState() {
/*
* Suppose a client uses this preference type without persisting. We
* must save the instance state so it is able to, for example, survive
* orientation changes.
*/ final Parcelable superState = super.onSaveInstanceState();
if (isPersistent()) {
// No need to save instance state since it's persistent
return superState;
} // Save the instance state
final SavedState myState = new SavedState(superState);
myState.progress = mProgress;
myState.max = mMax;
return myState;
} @Override
protected void onRestoreInstanceState(Parcelable state) {
if (!state.getClass().equals(SavedState.class)) {
// Didn't save state for us in onSaveInstanceState
super.onRestoreInstanceState(state);
return;
} // Restore the instance state
SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
mProgress = myState.progress; mMax = myState.max;
notifyChanged();
} /**
* SavedState, a subclass of {@link BaseSavedState}, will store the state
* of MyPreference, a subclass of Preference.
* <p>
* It is important to always call through to super methods.
*/
private static class SavedState extends BaseSavedState {
int progress;
int max; public SavedState(Parcel source) {
super(source);
// Restore the click counter
progress = source.readInt();
max = source.readInt();
} @Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
// Save the click counter
dest.writeInt(progress);
dest.writeInt(max);
} public SavedState(Parcelable superState) {
super(superState);
} }
}
自己写的SeekBarPreference,可以实现seekbar滑动监听和设置默认进度和最大进度的更多相关文章
- 使用swipecard实现卡片视图左右滑动监听以及点击监听
前言: 大家好,今天给大家介绍安卓一种特别实用有很酷炫的组件swipecard,当然这并不是安卓爸爸创造的,这是国内的一个我认为是大牛的一个人随便写着玩儿搞出来了,我看了他的代码介绍已经很清晰了,但 ...
- 移动端H5页面惯性滑动监听
移动端H5页面惯性滑动监听 在移动端,当你快速滑动有滚动条的页面时,当你手指离开屏幕时,滚动条并不会立即停止,而是会随着"惯性"继续滑动一段距离. 在做项目的过程中,需要监听惯性滑 ...
- Android RecyclerView滑动监听,判断是否滑动到了最后一个item
项目中的需求,RecyclerView横向滑动列表,要有加载更多的功能,给RecyclerView设置一个滑动监听,在onScrolled方法中判断一下滑动方向,然后在onScrollStateCha ...
- Listview的OnScrollListener的滑动监听实现分页加载
//---------------主布局文件---------------------------- <ListView android:layout_width="fill_pare ...
- Android 自定义ScrollView的滑动监听事件
项目结构: 1.LazyScrollView类(自定义ScrollView) package android.zhh.com.myapplicationscrollview; /** * Create ...
- ionic2+Angular ionScroll页面滑动监听
第一:需要在组件中引入相关模块: 第二:如果只是监听页面滑动,只需要标注@ViewChild(Content) content: Content;就可以了. 附加:如果要监听页面的某个元素,并对其进行 ...
- ScrollView滑动到底部或顶部监听,ScrollView滑动到底部或顶部再继续滑动监听;
ScrollView滑动到底部或顶部后,再继续滑动达到一定距离的监听: ScrollView滑动到底部或顶部的监听: /** * 监听ScrollView滚动到顶部或者底部做相关事件拦截 */ pub ...
- JavaScript之屏幕上下左右滑动监听
前言 存在这么一个需求,根据用户在屏幕不同的滑动方向(上.下.左.右),使用js脚本判断出不同的滑动行为,更新网页为不同的界面. 源码 参考了博文[1]的源码,但由于存在一些漏洞,比如:上下滑动事件监 ...
- Android WebView 向上向下滑动监听
在手势的 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {}代码 ...
随机推荐
- k8s的imagePullSecrets如何生成及使用
如果公司的docker仓库(harbor),需要用户认证之后,才能拉取镜像. 那如何在k8s里生成这个secret呢? 这个secret如何还原呢? 在k8s的yaml文件里如何实现呢? 这里提供几个 ...
- Top 10 Best Free Netflow Analyzers and Collectors for Windows
https://www.pcwdld.com/best-free-netflow-analyzers-and-collectors-for-windows https://blog.csdn.net/ ...
- 如何安装pycharm
Ubuntu系统安装PyCharm教程(详细图文) 参考(http://jingyan.baidu.com/article/60ccbceb4e3b0e64cab19733.html)
- Spark中hashshuffle与sortshuffle
在spark1.2以上的版本中,默认shuffle的方式已经变成了sortshuffle(在spark.shuffle.manager修改org.apache.spark.shuffle.sort.H ...
- Xamarin iOS教程之添加和定制视图
Xamarin iOS教程之添加和定制视图 Xamarin iOS用户界面——视图 在iPhone或者iPad中,用户看到的摸到的都是视图.视图是用户界面的重要组成元素.例如,想要让用户实现文本输入时 ...
- progress进度条的样式修改
由于公司在做的公众号上需要进度条,我就想着用progress标签,可是progress标签很难修改样式,因而在网上查询了一番. 现在总结一下. progress是H5新标签,主要用于显示进度条.由于他 ...
- 吴恩达-coursera-机器学习-week9
十五.异常检测(Anomaly Detection) 15.1 问题的动机 15.2 高斯分布 15.3 算法 15.4 开发和评价一个异常检测系统 15.5 异常检测与监督学习对比 15.6 选择特 ...
- BZOJ 4610: [Wf2016]Ceiling Functi 水题
4610: [Wf2016]Ceiling Functi 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4610 Description ...
- java判断集合是否重复的一种便捷方法
内容来自其它网站,感谢原作者! import java.util.ArrayList; import java.util.HashSet; import java.util.List; /** * 通 ...
- MikroTik RouterOS使用U盘安装提示FATAL ERROR: no CD-ROM found Press ENTER to reboot的问题解决
1.首先说明这个ROS是不能使用U盘安装的,无论你怎么修改都无法实现 2.还是老老实实的刻录iso关盘,或者挂载硬盘到虚拟机上进行安装.又或者使用netinstall进行安装. 3.别去找国外的方法, ...