/*
* Copyright (C) 2006 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.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
/**
* SeekBar 是 ProgressBar 的扩展,在其基础上增加了一个可滑动的滑片(注:就是那个可拖动的图标).
* 用户可以触摸滑片并向左或向右拖动,再或者可以使用方向键都可以设置当前的进度等级.
* 不建议把可以获取焦点的小部件放在 SeekBar 的左边或右边.
* <p>
* SeekBar 可以附加一个 {@link SeekBar.OnSeekBarChangeListener} 以获得用户操作的通知.
*
* @attr ref android.R.styleable#SeekBar_thumb
* @author translate by madgoat(Android中文翻译组)
* @author convert by cnmahj
*/
public class SeekBar extends AbsSeekBar {
/**
* 当进度改变后用于通知客户端的回调函数.
* 这包括用户通过手势、方向键或轨迹球触发的改变, 以及编程触发的改变.
*/
public interface OnSeekBarChangeListener {
/**
* 通知进度已经被修改.客户端可以使用 fromUser 参数区分用户触发的改变还是编程触发的改变.
*
* @param seekBar 当前被修改进度的 SeekBar.
* @param progress 当前的进度值.此值的取值范围为 0 到 max 之间.
* Max为用户通过 {@link ProgressBar#setMax(int)} 设置的值,默认为100.
* @param fromUser 如果是用户触发的改变则返回 True.
*/
void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser);
/**
* 通知用户已经开始一个触摸拖动手势.客户端可能需要使用这个来禁用 seekbar 的滑动功能.
* @param seekBar 触摸手势开始的 SeekBar.
*/
void onStartTrackingTouch(SeekBar seekBar);
/**
* 通知用户触摸手势已经结束.户端可能需要使用这个来启用 seekbar 的滑动功能.
* @param seekBar 触摸手势开始了的 SeekBar.
*/
void onStopTrackingTouch(SeekBar seekBar);
}
private OnSeekBarChangeListener mOnSeekBarChangeListener;
public SeekBar(Context context) {
this(context, null);
}
public SeekBar(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.seekBarStyle);
}
public SeekBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
void onProgressRefresh(float scale, boolean fromUser) {
super.onProgressRefresh(scale, fromUser);
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), fromUser);
}
}
/**
* 设置一个监听器以接受 seekbar 进度改变时的通知.
* 同时提供用户在 SeekBar 上开始和停止触摸手势时的通知.
*
* @param l SeekBar 的通知监听者
*
* @see SeekBar.OnSeekBarChangeListener
*/
public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
mOnSeekBarChangeListener = l;
}
@Override
void onStartTrackingTouch() {
super.onStartTrackingTouch();
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onStartTrackingTouch(this);
}
}
@Override
void onStopTrackingTouch() {
super.onStopTrackingTouch();
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onStopTrackingTouch(this);
}
}
@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
super.onInitializeAccessibilityEvent(event);
event.setClassName(SeekBar.class.getName());
}
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(SeekBar.class.getName());
}
}