关键词:
系统自定义的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自... 查看详情