一.SeekBar滑动条的使用

xml声明:

  1. <SeekBar android:id="@+id/seekbar"
  2. android:layout_width="200dip"
  3. android:layout_height="wrap_content"/>

xml声明

主要事件监听:OnSeekBarChangeListener

  1. @Override
  2. public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {
  3. // TODO Auto-generated method stub
  4. // 当Progress发生变化时触发
  5. }
  6.  
  7. @Override
  8. public void onStartTrackingTouch(SeekBar arg0) {
  9. // TODO Auto-generated method stub
  10. // 用户手势开始
  11. }
  12.  
  13. @Override
  14. public void onStopTrackingTouch(SeekBar arg0) {
  15. // TODO Auto-generated method stub
  16. // 用户手势结束
  17.  
  18. }

OnSeekBarChangeListener


二.自定义Seekbar样式:
使用selector自定义seekbar样式:

进度条样式:seekbar_progress.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  3.  
  4. <item android:id="@+android:id/background"
  5. android:drawable="@drawable/seekbar_background" />
  6.  
  7. <!-- 进度度 -->
  8. <item android:id="@+android:id/progress"
  9. android:drawable="@drawable/seekbar_foreground" />
  10. </layer-list>

进度条样式:seekbar_progress.xml

按钮样式:seekbar_thumb.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
  3.  
  4. <!-- 按下状态 -->
  5. <item android:drawable="@drawable/seekbar_thumb"
  6. android:state_pressed="true"/>
  7.  
  8. <!-- 普通无焦点状态 -->
  9. <item android:drawable="@drawable/seekbar_thumb"
  10. android:state_focused="false"
  11. android:state_pressed="false"/>
  12.  
  13. </selector>

按钮样式:seekbar_thumb.xml

使用自定义样式,分别添加在android:progressDrawable和android:thumb两个属性上:

  1. <SeekBar android:id="@+id/seekbar"
  2. android:layout_width="200dip"
  3. android:layout_height="wrap_content"
  4. android:progressDrawable="@drawable/seekbar_progress"
  5. android:thumb="@drawable/seekbar_thumb" />

使用自定义样式


三.创建竖直方向的Seekbar:

原理:
扩展Seekbar,重写onDraw方法,把Canvas旋转90度

VerticalSeekbar:

  1. public class VerticalSeekbar extends AbsSeekBar {
  2. private Drawable mThumb;
  3. private int height;
  4. private int width;
  5.  
  6. public interface OnSeekBarChangeListener {
  7. void onProgressChanged(VerticalSeekbar VerticalSeekBar, int progress,
  8. boolean fromUser);
  9.  
  10. void onStartTrackingTouch(VerticalSeekbar VerticalSeekBar);
  11.  
  12. void onStopTrackingTouch(VerticalSeekbar VerticalSeekBar);
  13. }
  14.  
  15. private OnSeekBarChangeListener mOnSeekBarChangeListener;
  16.  
  17. public VerticalSeekbar(Context context) {
  18. this(context, null);
  19. }
  20.  
  21. public VerticalSeekbar(Context context, AttributeSet attrs) {
  22. this(context, attrs, android.R.attr.seekBarStyle);
  23. }
  24.  
  25. public VerticalSeekbar(Context context, AttributeSet attrs, int defStyle) {
  26. super(context, attrs, defStyle);
  27. }
  28.  
  29. public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
  30. mOnSeekBarChangeListener = l;
  31. }
  32.  
  33. void onStartTrackingTouch() {
  34. if (mOnSeekBarChangeListener != null) {
  35. mOnSeekBarChangeListener.onStartTrackingTouch(this);
  36. }
  37. }
  38.  
  39. void onStopTrackingTouch() {
  40. if (mOnSeekBarChangeListener != null) {
  41. mOnSeekBarChangeListener.onStopTrackingTouch(this);
  42. }
  43. }
  44.  
  45. void onProgressRefresh(float scale, boolean fromUser) {
  46.  
  47. Drawable thumb = mThumb;
  48. if (thumb != null) {
  49. setThumbPos(getHeight(), thumb, scale, Integer.MIN_VALUE);
  50. invalidate();
  51. }
  52. if (mOnSeekBarChangeListener != null) {
  53. mOnSeekBarChangeListener.onProgressChanged(this, getProgress(),
  54. fromUser);
  55. }
  56. }
  57.  
  58. private void setThumbPos(int w, Drawable thumb, float scale, int gap) {
  59.  
  60. int available = w + getPaddingLeft() - getPaddingRight();
  61. int thumbWidth = thumb.getIntrinsicWidth();
  62. int thumbHeight = thumb.getIntrinsicHeight();
  63. available -= thumbWidth;
  64. // The extra space for the thumb to move on the track
  65. available += getThumbOffset() * 2;
  66. int thumbPos = (int) (scale * available);
  67. int topBound, bottomBound;
  68. if (gap == Integer.MIN_VALUE) {
  69. Rect oldBounds = thumb.getBounds();
  70. topBound = oldBounds.top;
  71. bottomBound = oldBounds.bottom;
  72. } else {
  73. topBound = gap;
  74. bottomBound = gap + thumbHeight;
  75. }
  76. thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);
  77. }
  78.  
  79. protected void onDraw(Canvas c) {
  80.  
  81. //这里控制的是seekbar旋转的方向,用隐去的这两行配合下边注释掉的trackTouchEvent,可以实现
  82. //初始位置在上边的seekbar,现在默认的是初始位置在最下边,及0在下边
  83. /*c.rotate(90);
  84. c.translate(0, -width);*/
  85.  
  86. //更改方向
  87. c.rotate(-90);
  88. c.translate(-this.getHeight(), 0);
  89.  
  90. super.onDraw(c);
  91. }
  92.  
  93. private void trackTouchEvent(MotionEvent event)
  94.  
  95. {
  96.  
  97. final int height = getHeight();
  98.  
  99. int y = (int)event.getY();
  100.  
  101. float scale = 0;
  102.  
  103. float progress = 0;
  104.  
  105. if(y > height)
  106.  
  107. {
  108. scale = 0.0f;
  109. }
  110.  
  111. else if( y>0 )
  112.  
  113. {
  114.  
  115. scale = 1-(float)y / (float)height;
  116.  
  117. }
  118.  
  119. else
  120.  
  121. {
  122.  
  123. scale= 1.0f;
  124.  
  125. }
  126.  
  127. final int max = getMax();
  128.  
  129. progress = scale * max;
  130.  
  131. setProgress(Math.round(progress));
  132.  
  133. setThumbPos(getHeight(), mThumb, scale, 0) ;
  134.  
  135. }
  136.  
  137. protected synchronized void onMeasure(int widthMeasureSpec,
  138. int heightMeasureSpec) {
  139. height = View.MeasureSpec.getSize(heightMeasureSpec);
  140. width = View.MeasureSpec.getSize(widthMeasureSpec);
  141. this.setMeasuredDimension(width, height);
  142.  
  143. }
  144.  
  145. @Override
  146. public void setThumb(Drawable thumb) {
  147. mThumb = thumb;
  148. super.setThumb(thumb);
  149. }
  150.  
  151. protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  152. super.onSizeChanged(h, w, oldw, oldh);
  153. }
  154.  
  155. public boolean onTouchEvent(MotionEvent event) {
  156. if (!isEnabled()) {
  157. return false;
  158. }
  159. switch (event.getAction()) {
  160. case MotionEvent.ACTION_DOWN:
  161. setPressed(true);
  162. onStartTrackingTouch();
  163. trackTouchEvent(event);
  164. break;
  165.  
  166. case MotionEvent.ACTION_MOVE:
  167. trackTouchEvent(event);
  168. attemptClaimDrag();
  169. break;
  170.  
  171. case MotionEvent.ACTION_UP:
  172. trackTouchEvent(event);
  173. onStopTrackingTouch();
  174. setPressed(false);
  175. break;
  176.  
  177. case MotionEvent.ACTION_CANCEL:
  178. onStopTrackingTouch();
  179. setPressed(false);
  180. break;
  181. }
  182. return true;
  183. }
  184.  
  185. /* private void trackTouchEvent(MotionEvent event) {
  186. final int Height = getHeight();
  187. final int available = Height - getPaddingBottom() - getPaddingTop();
  188. int Y = (int) event.getY();
  189. Log.d("6", "trackTouchEvent==>Y"+Y);
  190. float scale;
  191. float progress = 0;
  192. if (Y > Height - getPaddingBottom()) {
  193. scale = 1.0f;
  194. } else if (Y < getPaddingTop()) {
  195. scale = 0.0f;
  196. } else {
  197. scale = (float) (Y)
  198. / (float) available;
  199. }
  200.  
  201. final int max = getMax();
  202. progress = scale * max;
  203.  
  204. setProgress((int) progress);
  205. }*/
  206.  
  207. private void attemptClaimDrag() {
  208. if (getParent() != null) {
  209. getParent().requestDisallowInterceptTouchEvent(true);
  210. }
  211. }
  212.  
  213. public boolean dispatchKeyEvent(KeyEvent event) {
  214. if (event.getAction() == KeyEvent.ACTION_DOWN) {
  215. KeyEvent newEvent = null;
  216. switch (event.getKeyCode()) {
  217. case KeyEvent.KEYCODE_DPAD_UP:
  218. newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
  219. KeyEvent.KEYCODE_DPAD_RIGHT);
  220. break;
  221. case KeyEvent.KEYCODE_DPAD_DOWN:
  222. newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
  223. KeyEvent.KEYCODE_DPAD_LEFT);
  224. break;
  225. case KeyEvent.KEYCODE_DPAD_LEFT:
  226. newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
  227. KeyEvent.KEYCODE_DPAD_DOWN);
  228. break;
  229. case KeyEvent.KEYCODE_DPAD_RIGHT:
  230. newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,
  231. KeyEvent.KEYCODE_DPAD_UP);
  232. break;
  233. default:
  234. newEvent = new KeyEvent(KeyEvent.ACTION_DOWN, event
  235. .getKeyCode());
  236. break;
  237. }
  238. return newEvent.dispatch(this);
  239. }
  240. return false;
  241. }
  242. }

VerticalSeekbar

使用VerticalSeekbar:

  1. <com.haidilao.views.VerticalSeekbar
  2. android:id="@+id/seekbar"
  3. android:layout_width="25dip"
  4. android:layout_height="130dip"
  5. android:paddingTop="1dip"
  6. android:layout_marginBottom="12dip"
  7. android:progressDrawable="@drawable/verticalseekbar_progressdrawable"
  8. android:thumb="@drawable/verticalseekbar_thumb"
  9. android:thumbOffset="0dip"
  10. android:max="100" />

VerticalSeekbar

[Android学习笔记]SeekBar的使用的更多相关文章

  1. 【转】Pro Android学习笔记(二三):用户界面和控制(11):其他控件

    目录(?)[-] Chronometer计时器控件 倒计时CountDownTimer Switch控件 Space控件 其他控件 Android提供了很多控件,基本上都是view的扩展. Chron ...

  2. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  3. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  4. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  5. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  6. udacity android 学习笔记: lesson 4 part b

    udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  7. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  8. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  9. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

随机推荐

  1. 使用ffmpeg视频编码过程中踩的一个坑

           今天说说使用ffmpeg在写视频编码程序中踩的一个坑,这个坑让我花了好多时间,回头想想,非常多时候一旦思维定势真的挺难突破的.以下是不对的编码结果:                   ...

  2. NHibernate -- HQL

    使用NHibernate中的HQL来查询数据. 代码: /// <summary> /// 查找事件 /// </summary> private void btn_Selec ...

  3. adb logcat 命令行用法

    作者 :万境绝尘  转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入  ...

  4. 原码、反码、补码和移码事实上非常easy

    近期在备战软考,复习到计算机组成原理的时候,看到书中关于原码.反码.补码和移码的定义例如以下(n是机器字长): 原码: 反码: 补码: 移码: 看完这些定义以后,我的脑袋瞬间膨胀到原来的二倍!这样变态 ...

  5. 增强SEO的div+css命名规则

    页头:header登录条:loginBar标志:logo侧栏:sideBar广告:banner导航:nav子导航:subNav菜单:menu子菜单:subMenu搜索:search滚动:scroll页 ...

  6. Spring boot jar 后台运行

    start(){ now=`date "+%Y%m%d%H%M%S"` exec java -Xms256m -Xmx512m -jar /alidata/server/webap ...

  7. VS2008通过 map 和 cod 文件定位崩溃代码行

    VS 2005/2008使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一 ...

  8. 安卓开发23:Service详细解读

    关于Service Service说明:Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它 ...

  9. python输出htmltestrunner中文乱码如何解决

    python unittest要产生一个可看的报告,需要借助一个第三方的包 下载HTMLTestRunner.py 第三方库 ,参考地址: http://tungwaiyip.info/softwar ...

  10. js验证日期

    寻寻觅觅,Web开发里,对日期的验证太多了,网上好多是用正则表达式来验证,但是这种验证也只能验证格式,没办法验证有效性,比如平年(2月28天)和闰年(2月29天).平时用得多,以前经常用一次写一次,腻 ...