自定义垂直拖动的seekbar进度条

Sharley Sharley     2022-09-26     550

关键词:

系统自定义的seekbar为横向拖动的样式,需要纵向的时则需要自己定义,网上很多说了重写系统SeekBar中onDraw()的方法,但是我使用的时候不知道为什么拖动条和点偏离了,不在一条直线上,好气。。。

然后用了另一篇中改进之后的自定义bar,效果才正常,下面贴出代码

  1 import android.content.Context;
  2 import android.graphics.Canvas;
  3 import android.util.AttributeSet;
  4 import android.view.MotionEvent;
  5 import android.view.ViewConfiguration;
  6 import android.view.ViewParent;
  7 import android.widget.SeekBar;
  8 
  9 
 10 
 11 public class VerticalSeekBar extends SeekBar {
 12     private boolean mIsDragging;
 13     private float mTouchDownY;
 14     private int mScaledTouchSlop;
 15     private boolean isInScrollingContainer = false;
 16 
 17     public boolean isInScrollingContainer() {
 18         return isInScrollingContainer;
 19     }
 20 
 21     public void setInScrollingContainer(boolean isInScrollingContainer) {
 22         this.isInScrollingContainer = isInScrollingContainer;
 23     }
 24 
 25     /**
 26      * On touch, this offset plus the scaled value from the position of the
 27      * touch will form the progress value. Usually 0.
 28      */
 29     float mTouchProgressOffset;
 30 
 31     public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {
 32         super(context, attrs, defStyle);
 33         mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
 34 
 35     }
 36 
 37     public VerticalSeekBar(Context context, AttributeSet attrs) {
 38         super(context, attrs);
 39     }
 40 
 41     public VerticalSeekBar(Context context) {
 42         super(context);
 43     }
 44 
 45     @Override
 46     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
 47         super.onSizeChanged(h, w, oldh, oldw);
 48     }
 49 
 50     @Override
 51     protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 52         super.onMeasure(heightMeasureSpec, widthMeasureSpec);
 53         setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
 54     }
 55 
 56     @Override
 57     protected synchronized void onDraw(Canvas canvas) {
 58         canvas.rotate(-90);
 59         canvas.translate(-getHeight(), 0);
 60         super.onDraw(canvas);
 61     }
 62 
 63     @Override
 64     public boolean onTouchEvent(MotionEvent event) {
 65         if (!isEnabled()) {
 66             return false;
 67         }
 68 
 69         switch (event.getAction()) {
 70             case MotionEvent.ACTION_DOWN:
 71                 if (isInScrollingContainer()) {
 72                     mTouchDownY = event.getY();
 73                 }
 74                 else {
 75                     setPressed(true);
 76 
 77                     invalidate();
 78                     onStartTrackingTouch();
 79                     trackTouchEvent(event);
 80                     attemptClaimDrag();
 81 
 82                     onSizeChanged(getWidth(), getHeight(), 0, 0);
 83                 }
 84                 break;
 85 
 86             case MotionEvent.ACTION_MOVE:
 87                 if (mIsDragging)
 88                 {
 89                     trackTouchEvent(event);
 90 
 91                 }
 92                 else
 93                 {
 94                     final float y = event.getY();
 95                     if (Math.abs(y - mTouchDownY) > mScaledTouchSlop)
 96                     {
 97                         setPressed(true);
 98 
 99                         invalidate();
100                         onStartTrackingTouch();
101                         trackTouchEvent(event);
102                         attemptClaimDrag();
103 
104                     }
105                 }
106                 onSizeChanged(getWidth(), getHeight(), 0, 0);
107                 break;
108 
109             case MotionEvent.ACTION_UP:
110                 if (mIsDragging)
111                 {
112                     trackTouchEvent(event);
113                     onStopTrackingTouch();
114                     setPressed(false);
115 
116                 }
117                 else
118                 {
119                     // Touch up when we never crossed the touch slop threshold
120                     // should
121                     // be interpreted as a tap-seek to that location.
122                     onStartTrackingTouch();
123                     trackTouchEvent(event);
124                     onStopTrackingTouch();
125 
126                 }
127                 onSizeChanged(getWidth(), getHeight(), 0, 0);
128                 // ProgressBar doesn't know to repaint the thumb drawable
129                 // in its inactive state when the touch stops (because the
130                 // value has not apparently changed)
131                 invalidate();
132                 break;
133         }
134         return true;
135 
136     }
137 
138     private void trackTouchEvent(MotionEvent event)
139     {
140         final int height = getHeight();
141         final int top = getPaddingTop();
142         final int bottom = getPaddingBottom();
143         final int available = height - top - bottom;
144 
145         int y = (int) event.getY();
146 
147         float scale;
148         float progress = 0;
149 
150         // 下面是最小值
151         if (y > height - bottom)
152         {
153             scale = 0.0f;
154         }
155         else if (y < top)
156         {
157             scale = 1.0f;
158         }
159         else
160         {
161             scale = (float) (available - y + top) / (float) available;
162             progress = mTouchProgressOffset;
163         }
164 
165         final int max = getMax();
166         progress += scale * max;
167 
168         setProgress((int) progress);
169 
170     }
171 
172     /**
173      * This is called when the user has started touching this widget.
174      */
175     void onStartTrackingTouch()
176     {
177         mIsDragging = true;
178     }
179 
180     /**
181      * This is called when the user either releases his touch or the touch is
182      * canceled.
183      */
184     void onStopTrackingTouch()
185     {
186         mIsDragging = false;
187     }
188 
189     private void attemptClaimDrag()
190     {
191         ViewParent p = getParent();
192         if (p != null)
193         {
194             p.requestDisallowInterceptTouchEvent(true);
195         }
196     }
197 
198     @Override
199     public synchronized void setProgress(int progress)
200     {
201 
202         super.setProgress(progress);
203         onSizeChanged(getWidth(), getHeight(), 0, 0);
204 
205     }
206 }

代码取自:http://www.cnblogs.com/mengdd/archive/2013/04/08/3008482.html

android进度条(progressbar)和拖动条(seekbar)补充“自定义组件”(总结)(代码片段)

这周结束了,我也码了一周的字,感觉还是很有种脚踏实地的感觉的,有时间就可以看看自己的总结再查漏补缺,一步一个脚印,做出自己最理想的项目。  今天我们讲两点:1.ProgressBar:  其实前面也稍微提到过,但是只... 查看详情

android自定义进度值可拖动的seekbar(代码片段)

...坚持写。今天就简单的写一下我在项目中用到的算自定义seekbar的博客,需求是这样的,seekbar需要显示最左和最右值,进度要跟随进度块移动。看下效果图就明白了。其实实现起来很简单,主要是思路。自定义控... 查看详情

酷炫进度条自定义seekbar

...:需求:1、看了ui图可以知道这类似android自带的seekbar控件,2、一个水平进度条和一个圆形进度条;3、圆形进度条显示环形刻度和当前进度值 查看详情

酷炫进度条自定义seekbar(代码片段)

...:需求:1、看了ui图可以知道这类似android自带的seekbar控件,2、一个水平进度条和一个圆形进度条;3、圆形进度条显示环形刻度和当前进度值;4、并且圆形进度可滑动操作;最终实现效果:废话不多... 查看详情

android自定义可长按可点击不可拖动的seekbar

项目中遇见一个奇怪的需求就是SeekBar不可点击,可长按和拉着拖拽点拖动。一开始想着很简单嘛。屏蔽吊点击事件,SeekBar自带长按事件,差不多就搞定了,然而是我太天真啊,SeekBar自带的长按监听是无效的... 查看详情

seekbar(拖动条)

...:本节我们继续来学习Android的基本UI控件中的拖动条——SeekBar,相信大家对他并不陌生,最常见的地方就是音乐播放器或者视频播放器了,音量控制或者播放进度控制,都用到了这个SeekBar,我们先来看看SeekBar的类结构,来到官... 查看详情

html自定义拖动进度条,包含样式和事件

自定义可拖动的进度条,如下图效果:代码分三部分html<body><divid="demo"><divclass="progress"><divclass="progress-bar"><divclass="progress-thumb"></div></div></div></div>&l 查看详情

android自定义ratingbar(星级评分控件)

参考技术ARatingBar是基于SeekBar(拖动条)和ProgressBar(状态条)的扩展,用星形来显示等级评定!RatingBar实现的效果图:   看着自定义的样式远远比Android自带的样式好看多了,用户体验度远远提升,下面我们就来实现... 查看详情

seekbar拖动条的功能和用法

参考技术ASeekBar拖动条的功能和用法拖动条和进度条比较相似,拖动条通过滑块的位置标识数值。拖动条允许用户拖动滑块改变数值publicclassMainActivityextendsActivity    ImageViewiv;    SeekBarseb;   ... 查看详情

seekbar属性设置

参考技术ASeekBar是滑动条组件,在音视频的播放器的下面经常看到。该组件的属性:·android:max设置进度条的最大值。对应方法:setMax(intmax);max=100,代表它的取值范围是0-100,共101个值;·android:progress设置默认的进度值对应有方法... 查看详情

seekbar(代码片段)

进度,音量等的拖动条。方法setMax设置SeekBar的最大数值setProgress设置SeekBar当前的数值setSecondaryProgress设置SeekBar的第二数值,即当前拖动条推荐的数值事件实现SeekBar的SeekBar.OnSeekBarChangeListener接口。监听三个事件数值改变&#... 查看详情

自定义seekbar样式详解

...景android:thumb进度thumb(拖块)android:splitTrackthumb是否切割seekbar背景,默认true,会看到thumb周围区域被切割,效果如下(为了效果明显,背景高度特意改高了)seekbar_bg.xmlseekbar_thumb.xml可以不指定android:thumb指定android:thumbTint来改变th... 查看详情

android自定义可长按可点击不可拖动的seekbar

项目中遇见一个奇怪的需求就是SeekBar不可点击,可长按和拉着拖拽点拖动。一开始想着很简单嘛。屏蔽吊点击事件,SeekBar自带长按事件,差不多就搞定了,然而是我太天真啊,SeekBar自带的长按监听是无效的... 查看详情

Seekbar进度drawable异常行为onPause

】Seekbar进度drawable异常行为onPause【英文标题】:SeekbarprogressdrawableabnormalbehavioronPause【发布时间】:2016-08-0918:51:14【问题描述】:我在片段中显示了一个搜索栏。搜索栏具有自定义拇指和进度可绘制对象。它们显示得很好,但是... 查看详情

进度部分上的 Seekbar 外阴影

】进度部分上的Seekbar外阴影【英文标题】:Seekbaroutershadowonprogresspart【发布时间】:2017-05-1012:07:45【问题描述】:我在Android中自定义了一个搜索栏,试图只获取填充部分的内部和外部阴影(底部)。我想要这样的结果:此刻,... 查看详情

如何自定义seekbar的样式?

...几个数据后依然一头雾水.... 参考技术B请问楼主,怎么把seekbar设置成半圆型的。如何自定义啊。。。。。。等候楼主答复 参考技术C  SeekBar的默认样式:  style="@android:style/Widget.SeekBar"  自定义方法如下:  <st... 查看详情

android开发中如何设置seekbar的最小值?

设置拖动条SeekBar的拖动范围,如70-100之间。SeekBar是ProgressBar的扩展,在其基础上增加了一个可拖动的thumb(注:就是那个可拖动的图标)。用户可以触摸thumb并向左或向右拖动,再或者可以使用方向键都可以设置当前的进度等级。... 查看详情

androidseekbar使用(代码片段)

本文主要是介绍androidseekbar的使用。一、含义SeekBar是拖动条,是ProgressBar的一个子类,如:音乐播放、音量条、播放进度条等。效果图:二、常用属性和方法属性名含义progress设置该进度条的最大值progressDrawable自... 查看详情