[Android学习笔记]SeekBar的使用
一.SeekBar滑动条的使用
xml声明:
<SeekBar android:id="@+id/seekbar"
android:layout_width="200dip"
android:layout_height="wrap_content"/>
xml声明
主要事件监听:OnSeekBarChangeListener
@Override
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
// TODO Auto-generated method stub
// 当Progress发生变化时触发
} @Override
public void onStartTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
// 用户手势开始
} @Override
public void onStopTrackingTouch(SeekBar arg0) {
// TODO Auto-generated method stub
// 用户手势结束 }
OnSeekBarChangeListener
二.自定义Seekbar样式:
使用selector自定义seekbar样式:
进度条样式:seekbar_progress.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="@drawable/seekbar_background" /> <!-- 进度度 -->
<item android:id="@+android:id/progress"
android:drawable="@drawable/seekbar_foreground" />
</layer-list>
进度条样式:seekbar_progress.xml
按钮样式:seekbar_thumb.xml
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 按下状态 -->
<item android:drawable="@drawable/seekbar_thumb"
android:state_pressed="true"/> <!-- 普通无焦点状态 -->
<item android:drawable="@drawable/seekbar_thumb"
android:state_focused="false"
android:state_pressed="false"/> </selector>
按钮样式:seekbar_thumb.xml
使用自定义样式,分别添加在android:progressDrawable和android:thumb两个属性上:
<SeekBar android:id="@+id/seekbar"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/seekbar_progress"
android:thumb="@drawable/seekbar_thumb" />
使用自定义样式
三.创建竖直方向的Seekbar:
原理:
扩展Seekbar,重写onDraw方法,把Canvas旋转90度
VerticalSeekbar:
public class VerticalSeekbar extends AbsSeekBar {
    private Drawable mThumb;
    private int height;
    private int width;
    public interface OnSeekBarChangeListener {
        void onProgressChanged(VerticalSeekbar VerticalSeekBar, int progress,
                boolean fromUser);
        void onStartTrackingTouch(VerticalSeekbar VerticalSeekBar);
        void onStopTrackingTouch(VerticalSeekbar VerticalSeekBar);
    }
    private OnSeekBarChangeListener mOnSeekBarChangeListener;
    public VerticalSeekbar(Context context) {
        this(context, null);
    }
    public VerticalSeekbar(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.seekBarStyle);
    }
    public VerticalSeekbar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
        mOnSeekBarChangeListener = l;
    }
    void onStartTrackingTouch() {
        if (mOnSeekBarChangeListener != null) {
            mOnSeekBarChangeListener.onStartTrackingTouch(this);
        }
    }
    void onStopTrackingTouch() {
        if (mOnSeekBarChangeListener != null) {
            mOnSeekBarChangeListener.onStopTrackingTouch(this);
        }
    }
    void onProgressRefresh(float scale, boolean fromUser) {
        Drawable thumb = mThumb;
        if (thumb != null) {
            setThumbPos(getHeight(), thumb, scale, Integer.MIN_VALUE);
            invalidate();
        }
        if (mOnSeekBarChangeListener != null) {
            mOnSeekBarChangeListener.onProgressChanged(this, getProgress(),
                    fromUser);
        }
    }
    private void setThumbPos(int w, Drawable thumb, float scale, int gap) {
        int available = w + getPaddingLeft() - getPaddingRight();
        int thumbWidth = thumb.getIntrinsicWidth();
        int thumbHeight = thumb.getIntrinsicHeight();
        available -= thumbWidth;
        // The extra space for the thumb to move on the track
        available += getThumbOffset() * 2;
        int thumbPos = (int) (scale * available);
        int topBound, bottomBound;
        if (gap == Integer.MIN_VALUE) {
            Rect oldBounds = thumb.getBounds();
            topBound = oldBounds.top;
            bottomBound = oldBounds.bottom;
        } else {
            topBound = gap;
            bottomBound = gap + thumbHeight;
        }
        thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);
    }
    protected void onDraw(Canvas c) {
        //这里控制的是seekbar旋转的方向,用隐去的这两行配合下边注释掉的trackTouchEvent,可以实现
        //初始位置在上边的seekbar,现在默认的是初始位置在最下边,及0在下边
        /*c.rotate(90);
        c.translate(0, -width);*/
        //更改方向
        c.rotate(-90);
        c.translate(-this.getHeight(), 0);
        super.onDraw(c);
    }
    private void trackTouchEvent(MotionEvent event)
    {
        final int height = getHeight();
        int y = (int)event.getY();                 
        float scale = 0;
        float progress = 0;
        if(y > height)
        {
            scale = 0.0f;
        }
        else if( y>0 )
        {
            scale = 1-(float)y / (float)height;       
        }
        else
        {
        scale= 1.0f;
        }
        final int max = getMax();
        progress = scale * max;                         
        setProgress(Math.round(progress));                  
        setThumbPos(getHeight(), mThumb, scale, 0) ;    
    }
    protected synchronized void onMeasure(int widthMeasureSpec,
            int heightMeasureSpec) {
        height = View.MeasureSpec.getSize(heightMeasureSpec);
        width = View.MeasureSpec.getSize(widthMeasureSpec);
        this.setMeasuredDimension(width, height);
    }
    @Override
    public void setThumb(Drawable thumb) {
        mThumb = thumb;
        super.setThumb(thumb);
    }
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(h, w, oldw, oldh);
    }
    public boolean onTouchEvent(MotionEvent event) {
        if (!isEnabled()) {
            return false;
        }
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            setPressed(true);
            onStartTrackingTouch();
            trackTouchEvent(event);
            break;
        case MotionEvent.ACTION_MOVE:
            trackTouchEvent(event);
            attemptClaimDrag();
            break;
        case MotionEvent.ACTION_UP:
            trackTouchEvent(event);
            onStopTrackingTouch();
            setPressed(false);
            break;
        case MotionEvent.ACTION_CANCEL:
            onStopTrackingTouch();
            setPressed(false);
            break;
        }
        return true;
    }
/*    private void trackTouchEvent(MotionEvent event) {
        final int Height = getHeight();
        final int available = Height - getPaddingBottom() - getPaddingTop();
        int Y = (int) event.getY();
        Log.d("6", "trackTouchEvent==>Y"+Y);
        float scale;
        float progress = 0;
        if (Y > Height - getPaddingBottom()) {
            scale = 1.0f;
        } else if (Y < getPaddingTop()) {
            scale = 0.0f;
        } else {
            scale = (float) (Y)
                    / (float) available;
        }
        final int max = getMax();
        progress = scale * max;
        setProgress((int) progress);
    }*/
    private void attemptClaimDrag() {
        if (getParent() != null) {
            getParent().requestDisallowInterceptTouchEvent(true);
        }
    }
    public boolean dispatchKeyEvent(KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            KeyEvent newEvent = null;
            switch (event.getKeyCode()) {
            case KeyEvent.KEYCODE_DPAD_UP:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DPAD_RIGHT);
                break;
            case KeyEvent.KEYCODE_DPAD_DOWN:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DPAD_LEFT);
                break;
            case KeyEvent.KEYCODE_DPAD_LEFT:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DPAD_DOWN);
                break;
            case KeyEvent.KEYCODE_DPAD_RIGHT:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_DPAD_UP);
                break;
            default:
                newEvent = new KeyEvent(KeyEvent.ACTION_DOWN, event
                        .getKeyCode());
                break;
            }
            return newEvent.dispatch(this);
        }
        return false;
    }
}
VerticalSeekbar
使用VerticalSeekbar:
<com.haidilao.views.VerticalSeekbar
android:id="@+id/seekbar"
android:layout_width="25dip"
android:layout_height="130dip"
android:paddingTop="1dip"
android:layout_marginBottom="12dip"
android:progressDrawable="@drawable/verticalseekbar_progressdrawable"
android:thumb="@drawable/verticalseekbar_thumb"
android:thumbOffset="0dip"
android:max="100" />
VerticalSeekbar
[Android学习笔记]SeekBar的使用的更多相关文章
- 【转】Pro Android学习笔记(二三):用户界面和控制(11):其他控件
		目录(?)[-] Chronometer计时器控件 倒计时CountDownTimer Switch控件 Space控件 其他控件 Android提供了很多控件,基本上都是view的扩展. Chron ... 
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
		学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ... 
- Android学习笔记进阶之在图片上涂鸦(能清屏)
		Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ... 
- android学习笔记36——使用原始XML文件
		XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ... 
- Android学习笔记之JSON数据解析
		转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ... 
- udacity android 学习笔记: lesson 4 part b
		udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ... 
- Android学习笔记36:使用SQLite方式存储数据
		在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ... 
- Android学习笔记之Activity详解
		1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ... 
- Pro Android学习笔记 ActionBar(1):Home图标区
		 Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ... 
随机推荐
- PHP - 防止非法调用页面
			这是在服务器内部: 首先定义一个常量 在调用页面的时候,检测是否存在此常量 如果存在,则调用 否则,做出提示. 创建常量: 创建常量的函数名称: define //创建一个常量,以便于页面调用,从主页 ... 
- spark集群安装配置
			spark集群安装配置 一. Spark简介 Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发.Spark基于map reduce 算法模式实现的分布式计算,拥有Hadoo ... 
- iOS开发--in house发布和安装(ipa重新签名)
			in house从字面意思理解就是‘内部的’,in house版本的ipa就是一个用于公司内部使用或测试的一个苹果应用程序安装包. 作为一个app应用程序开发者,在app应用程序在苹果商店上架前总需要 ... 
- 基于visual Studio2013解决C语言竞赛题之1029二元数组平均值
			      题目 解决代码及点评 /* 功能:求二维数组中每行元素的平均值,不许引入其它的数组 时间:16:21 2013/10/24 */ #include<stdio ... 
- 代码格式化工具Astyle配置
			Astyle是一个很好的代码格式化工具,其他不多说,下面介绍一下我在VS 2010的配置 1. http://sourceforge.net/projects/astyle,这是该插件的网站,下载后把 ... 
- 使用boost io_service时,需要注意的东西
			boost::asio 在创建io_service时,可以指定线程数,如果没有指定,默认是一个线程,也就是io_service run的那个线程,如果没有任务运行,该线程会退出. 如果在创建的时候指定 ... 
- Kendo UI开发教程(25): 单页面应用(三) View
			View为屏幕上某个可视部分,可以处理用户事件. View可以通过HTML创建或是通过script元素.缺省情况下View将其所包含的内容封装在一个Div元素中.Kendo创建View有两种方式: 使 ... 
- hdu 4803 贪心/思维题
			http://acm.hdu.edu.cn/showproblem.php?pid=4803 话说C++还卡精度么? G++ AC C++ WA 我自己的贪心策略错了 -- 就是尽量下键,然后上 ... 
- Effective C++_笔记_条款05_了解C++默认编写并调用哪些函数
			(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 直接上代码: 1: class Empty{}; 如果你写了这样 ... 
- 网页 HTML
			HTML--超文本标记语言Hyper Text Markup Language. 一,常规标签 (1)格式控制(记忆模型--Word工具栏) <b></b>加粗,<i&g ... 
