之前根据网友的博文写了一个Demo(点击打开链接)但是这个Demo用到attr,layout color,还有其他的类,给使用者造成很多麻烦,我想,这样的自定义控件为啥不用一个类来完成呢,这样直接复制过来就能用,于是我彻底的封装了这个自定义的SeekBar,做到了一个类完成所有功能,而且代码量也不多。效果图:

原理,其实我不是自定义SeekBar,我是自定义了一个RelativeLayout,里面放了三个TextView和一个SeekBar,用代码控制他们的位置,实现动态显示值。

首先,向自定义的RelativeLayout用代码添加子控件,这样就不用XML来布局了

private void addChildens() {textView = new ProgressTextView(mContext);textView.setId(View.generateViewId());LayoutParams lpTextView = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 40);textView.setLayoutParams(lpTextView);addView(textView);mSeekBar = new SeekBar(mContext);mSeekBar.setId(View.generateViewId());mSeekBar.setMax(seekBarMax);mSeekBar.setMinimumHeight(12);if (thumDrawable > 0) {mSeekBar.setThumb(ContextCompat.getDrawable(mContext, thumDrawable));}if (seekBarDrawable > 0) {mSeekBar.setBackgroundResource(seekBarDrawable);}mSeekBar.setPadding(0, 0, 0, 0);mSeekBar.setThumbOffset(0);LayoutParams lpSeekBar = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);lpSeekBar.addRule(RelativeLayout.BELOW, textView.getId());mSeekBar.setLayoutParams(lpSeekBar);addView(mSeekBar);mTvStart = new TextView(mContext);LayoutParams lpStart = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);lpStart.addRule(ALIGN_PARENT_LEFT);lpStart.addRule(RelativeLayout.BELOW, mSeekBar.getId());mTvStart.setLayoutParams(lpStart);addView(mTvStart);mTvEnd = new TextView(mContext);LayoutParams lpEnd = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);lpEnd.addRule(ALIGN_PARENT_RIGHT);lpEnd.addRule(RelativeLayout.BELOW, mSeekBar.getId());mTvEnd.setLayoutParams(lpEnd);addView(mTvEnd);}

然后就是自定义的一个浮标并显示SeekBar的值:

class ProgressTextView extends View {private int mHeight;private int mWidth;private double mOneProgressWidth;private int mCurProgress = 0;private String mProgressText = "";private Paint mPaint;private float mThumbOffset;private int mTextSize = 12;private float thumWidth;private String mTextColor = "#303F9F";//default color of columnpublic ProgressTextView(Context context) {super(context);initObserver();}@RequiresApi(api = Build.VERSION_CODES.M)public ProgressTextView(Context context, AttributeSet attrs) {super(context, attrs);if (null != context && attrs != null) {mThumbOffset = thumWidth / 2;}initObserver();}private void initObserver() {ViewTreeObserver vto = getViewTreeObserver();vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@Overridepublic boolean onPreDraw() {mHeight = getMeasuredHeight();mWidth = getMeasuredWidth();initPaint();initData();return true;}});}private void initPaint() {mPaint = new Paint();mPaint.setTextSize(mTextSize);mPaint.setTextAlign(Paint.Align.CENTER);mPaint.setColor(Color.parseColor(mTextColor));}private void initData() {mOneProgressWidth = (double) (mWidth - 2 * mThumbOffset) / (seekBarMax);}public void setTextSize(int mTextSize) {this.mTextSize = mTextSize;invalidate();}@Overrideprotected void onDraw(Canvas canvas) {initPaint();drawText(canvas);super.onDraw(canvas);}//设置字体居中显示private void drawText(Canvas canvas) {float x = (float) (mCurProgress * mOneProgressWidth);float textWidth = mPaint.measureText(mProgressText);float textOffset = textWidth / 2;if (x + textOffset > mWidth - mThumbOffset) {//超过view的右边float exWidth = x + textOffset - (mWidth - mThumbOffset);x -= exWidth;//避免超过右边}if (x + mThumbOffset < textOffset) {//超过左边float exWidth = textOffset - (x + mThumbOffset);x += exWidth;//避免超过左边}canvas.translate(mThumbOffset, 0);canvas.drawText(mProgressText, x, mHeight, mPaint);}//设置显示的进度位置和字符串public void setProgress(int progress, String showText) {mCurProgress = progress;mProgressText = showText;invalidate();}}

我还写了监听器和各种setter,保证这个自定义View的可操作性

Demo源码

Android自定义SeekBar,带开始值结束值和Thumb上方滑动的Text相关推荐

  1. android背景颜色动态修改,Android自定义TextView带圆角及背景颜色(动态改变圆角背景颜色)...

    最近根据项目需求自定义了一个TextView控件,主要用来做状态的标识,比如一个订单状态有各种,当然了这种设置在Android中可以直接用xml文件来处理,但是对于xml文件太过于麻烦,针对不同的颜色 ...

  2. Android按钮滚动条,Android自定义Seekbar滑动条,Pop提示跟随滑动按钮一起滑动

    由于项目需要做出此效果,自定义写了一个. 效果图 思路: 原始的seekbar只有滑动条并没有下方的提示文字,所以我们必须要继承Seekbar重写这个控件. 代码: 在values文件夹下新建attr ...

  3. android自定义主题背景颜色,Android 自定义SeekBar 实现分段显示不同背景颜色的示例代码...

    在最近的开发工作中,要实现一个调色板的进度条,SeekBar要分成10段显示不同颜色,功夫不负有心人,终于实现了这个功能,下面分享给大家 示例图: 1.自定义SeekBar import androi ...

  4. [Android]自定义View带效果的滚动数字

    [Android]自定义View带效果的滚动数字 @Author GQ 2016年07月29日 一个可以让数字滚动的View,可以自定义参数,是想要的那种效果! 原文github地址 效果图 Andr ...

  5. android 自定义 seekbar,Android自定义控件 带文字提示的SeekBar

    封面 1.写在前面 SeekBar控件在开发中还是比较常见的,比如音视频进度.音量调节等,但是原生控件有时还不能满足我们的需求,今天就来学习一下如何自定义SeekBar控件,本文主要实现了一个带文字指 ...

  6. Android 自定义seekbar【仿微信联系人】

    /** *  * 转载请标明出处:http://blog.csdn.net/u013598111/article/details/50452578 *   @author:[JunTao_sun]   ...

  7. Android自定义Seekbar拖动条式样

    SeekBar拖动条可以由用户控制,进行拖动操作.比如,应用程序中用户需要对音量进行控制,就可以使用拖动条来实现. 1.SeekBar控件的使用 1.1SeekBar常用属性 SeekBar的常用属性 ...

  8. android自定义seekbar,Android自定义SeekBar实现视频播放进度条

    本文实例为大家分享了Android实现视频播放进度条的具体代码,供大家参考,具体内容如下 首先来看一下效果图,如下所示: 其中进度条如下: 接下来说一说我的思路,上面的进度拖动条有自定义的Thumb, ...

  9. android自定义seekbar样式,自定义SeekBar样式

    系统默认的seekbar很多时候不符合开发需求,那么就需要自定义seekbar的样式,方法并不复杂,下面记录一下: 布局文件中:android:thumb="@drawable/sanjia ...

最新文章

  1. Azure Logic Apps正式发布
  2. CentOS 如何搭建本地和局域网yum源
  3. LeetCode-笔记-45.跳跃游戏II-贪心算法
  4. Windows Vista Beta 1试用体会
  5. c语言快速排序案例,什么是快速排序?C语言数组快速排序例子
  6. Android 创建,删除,检测桌面快捷方式
  7. Codeforces Round #630 (Div. 2) F. Independent Set 树形dp
  8. 这40张图送给单身程序员,情人节请一笑而过!
  9. html文件怎么保存链接,如何使用beautifulsoup将链接的html保存在文件中,并对html文件中的所有链接执行相同的操作...
  10. Linux 配置vim编辑器
  11. uniapp打包安装后提示_本应用使用HBuilderX 2.8.12 或对应的cli版本编译,而手机端SDK版本是2.8.13---基于Vue的uniapp手机端_前端UI_uview工作笔记007
  12. PDF Converter OCR for Mac(pdf格式转换器及ocr识别工具)
  13. UML的类图中各箭头的含义
  14. 华硕笔记本电脑突然失去WIFI功能
  15. WinPcap vs Npcap
  16. Endnote Reference styles参考文献引用模版制作——附毕设大论文引用模版
  17. 深入浅出Google Clould Platform (1)----GCP 考证
  18. tcp端对端 ip点对点
  19. LyX使用小记之二 图像
  20. 智课雅思短语---五、 in contrast / on the contrary

热门文章

  1. 干货!实战!你领取的优惠券都是怎么样实现的?
  2. 网络计划法中的最早时间和最迟时间以及关键事件。
  3. java点餐系统实验报告_JAVA课程实践报告 基于web的点餐系统毕业设计.doc
  4. 长春理工计算机学院保研外校,长春理工大学174被保研:近7成保研985高校,还有清华、北大……...
  5. python正则表达式中括号的用法_Python的正则表达式中的圆括号到底如何使用?
  6. node更改html中的列表,HTMLCollection和NodeList
  7. 预处理对象executeQuery方法,对数据库进行有条件和无条件的查询
  8. iOS 基于 AVFoundation 制作的用于剪辑视频项目
  9. shell-判断两个ip是否在同一个网段
  10. 中国IPv6千万不要“起大早,赶晚集”