这里用SeekBar做演示,SeekBar继承自ProgressBar,拥有其一切特性,并且其支持拖动以及DPAD左右键的进退。一起学习吧!

一、自定义SeekBar进度条样式

原生SeekBar效果如图

原生SeekBar样式

1. 自定义SeekBar进度条样式一

效果:颜色随着进度从#00ff00到#0000ff渐变

布局文件

android:id="@+id/seekbar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:maxHeight="6dp"

android:progressDrawable="@drawable/progress_horizontal"

android:thumb="@drawable/seekbar_thumb" />

progressDrawable用来定义与进度有关的图片。

res/drawable/progress_horizontal.xml

android:endColor="#0000ff"

android:startColor="#00ff00" />

thumb的和普通定义一个图片一样,这里就不贴代码了。

progressDrawable工作原理

ProgressBar通过progressDrawable属性拿到背景图,如果该图片是普通图片,则进度和没有进度看起来是一样的。如果采用LayerDrawable作为背景图,就可控制各个item的显示部分,从而模拟进度,当进度为0时@android:id/background该item可以完全看到

@android:id/progress的item图片会随着进度的变化而显示区域发生变化,例如进度为1%,该item图也只会显示1%,主要原理是标签,该标签对应ClipDrawable,其可以通过level值控制图片的显示部分,ProgressBar内部会随着进度变化设置ClipDrawable的level,从而实现进度效果。

2. 自定义SeekBar进度条样式二

效果:进度部分渐变保持不变,随着进度拉长

解决思路就是不断的更换进度部分图片,不过简单是进度部分可以是同一张图片,只需要动态改变长度即可。

res/drawable/progress_drawable.xml

android:height="6dp"

android:gravity="center_vertical">

android:width="0px"

android:height="6dp"

android:gravity="center_vertical">

android:endColor="#0000ff"

android:startColor="#00ff00" />

不需要加id部分,将其作为一张普通图片作为进度条背景。

实现思路:LayerDrawable默认最后的item显示在最上层,那么我们可以将第一个item作为进度条的整体颜色,第二个item作为进度部分颜色。第二个item宽度为0,也象征着进度为0,当进度条进度发生变化时,我们根据进度相对于整个进度条的比例计算出进度部分的宽度,从而调整第二个item的宽度实现上图效果。

布局文件保持不变,Java代码更改如下

seekBar = findViewById(R.id.seekbar);

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

@Override

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

progressTV.setText(progress + "%");

refreshProgressBackground(seekBar, progress);

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override

public void onStopTrackingTouch(SeekBar seekBar) {

}

});

private void refreshProgressBackground(SeekBar seekBar, int progress) {

// 1. 得到LayerDrawable

LayerDrawable layerDrawable = (LayerDrawable) getResources().getDrawable(R.drawable.seekbar_drawable);

// seekBar显示宽度

int avaliableWidth = seekBar.getWidth() - seekBar.getPaddingLeft() - seekBar.getPaddingRight();

// 进度部分宽度

int progressWidth = (int) (avaliableWidth * progress / (float) seekBar.getMax());

// 第二个item,下标为1

layerDrawable.setLayerWidth(1, progressWidth);

// 2. 重新设置ProgressDrawable

seekBar.setProgressDrawable(layerDrawable);

}

注释1出之所以不直接通过seekBar获取LayerDrawable,是因为在注释2出的setProgressDrawable方法内会判断Drawable和SeekBar以前所得到的progressDrawable是否相同,相同则不做任何操作,故每次需创建新的对象。

二、SeekBar及ProgressBar实现原理源码分析

由于时间问题,该部分后续更新

android如何创建进度条,Android控件ProgressBar--自定义进度条及源码分析相关推荐

  1. android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(一)

    原文:http://www.cnblogs.com/shanzei/p/4654817.html 第一部分: ANDROID应用ACTIVITY.DIALOG.POPWINDOW.TOAST窗口添加机 ...

  2. Discuz!NT控件剖析 之 Button [原创: 附源码]

      Discuz!NT控件剖析 之 Button [原创: 附源码] 收藏 在开源之后,还没什么文章来说明 Discuz!NT项目的一些特点.作为这个控件库的设计者,本人将在接下来的时间里用连载的方式 ...

  3. Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

    1  背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与LayoutInflater加载解析机制源码分析>, 然后有人在文章下面评论和微博 ...

  4. (转) Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

    转载[工匠若水 http://blog.csdn.net/yanbober ] 1 背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与Layou ...

  5. android 自定义button点击事件,自定义View(2)-从源码分析button的onClick和onTouch

    Android事件分发机制介绍 author:秦子帅 time: 2018-6-14 学习之前,我们先弄明白一件事,到底什么是Android事件分发机制?说白了就是Android触摸事件的传递流程. ...

  6. android的三个基础控件,Android基础控件——ProgressBar自定义的介绍、动画效果实现、附加三个漂亮的进度条...

    xml文件: android:centerColor="#00ff00" android:endColor="#0000ff" android:startCol ...

  7. Android基础控件——ProgressBar自定义的介绍、动画效果实现、附加三个漂亮的进度条

    ProgressBar自定义的介绍.动画效果实现.附加三个漂亮的进度条 shape属性介绍: corners 圆角   gradient 渐变   padding 内容离边界距离   size 大小 ...

  8. android 桌面图标的点击放大效果,Android仿英语流利说取词放大控件的实现方法(附demo源码下载)...

    本文实例讲述了Android仿英语流利说取词放大控件的实现方法.分享给大家供大家参考,具体如下: 1 取词放大控件 英语流利说是一款非常帮的口语学习app,在app的修炼页面长按屏幕,会弹出一个放大镜 ...

  9. 【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介 | 使用方法 | AsyncTask 源码分析 )

    文章目录 一.AsyncTask 参数简介 二.AsyncTask 方法简介 三.AsyncTask 基本用法 四.AsyncTask 构造函数源码解析 五.AsyncTask 构造函数相关源码注释 ...

  10. 【Kivy自学笔记】Python开发App必备!Kivy基础控件详解(含视频源码)

    文章目录 基础控件 窗口坐标系 尺寸(通用) 位置(通用) Python与kv文件如何实现互相访问(Kivy中的特殊关键字) Button 按钮 Label 标签 Image 图片 TextInput ...

最新文章

  1. delphi variant和stream相互转换的函数
  2. python编程语法-Python编程入门——基础语法详解(经典)
  3. 数学笔记:重要性采样
  4. java通过maven构建项目实现日志生成模拟(一)创建maven项目+安装配置Fastjson.jar和Logback.jar 和 slf4j.jar
  5. Knock Knock,这里有一封全球技术精英聚会的邀请函
  6. numpy安装_Python进阶之NumPy快速入门(一)
  7. nunjucks渲染富文本解析错误输出字符串而不是元素
  8. 自主可控的全数字实时仿真软件SkyEye支持PowerPC指令级仿真
  9. Spring Boot的学习之路(02):和你一起阅读Spring Boot官网
  10. 015-请问如果想进行bug的测评,怎么去评测bug?
  11. 2011-6-22精品软件【清风网络整理】
  12. hadoop:Secondary NameNode 它究竟有什么作用?
  13. Python爬虫入门教程 12-100 半次元COS图爬取
  14. PHP 使用TCPDF插件生成pdf以及pdf的中文处理
  15. 更高效的记录方式,讯飞智能录音笔体验出色
  16. github上 开源项目_在GitHub上组织开源项目的工作流程的3个技巧
  17. [Invariance Matters: Exemplar Memory for Domain Adaptive Person Re-identification 魔改代码
  18. 关于ios程序的后台运行
  19. Latex 双栏环境 (Double Column Floats)
  20. android java 指针_Android中用Java代码模拟鼠标指针(可显示于整个系统界面之上)...

热门文章

  1. Scrapy错误-no active project Unknown command: crawl
  2. 第二类修正贝塞尔函数
  3. (C语言!)广义表(头尾链表)的建立和输出
  4. 计算机的用户账户打不开怎么办,电脑用户密码忘记了打不开怎么办
  5. 1111qqqqqqqq
  6. socket编程之DEV C++配置winpcap开发环境并编写网络嗅探器sniffer
  7. 【数学建模】优劣解距离法(TOPSIS法)
  8. 软件调优方法有哪些?看看飞腾技术专家怎么说 | 龙蜥技术
  9. Gtalk 添加Groups
  10. 华为手机打开html文件,华为手机必须打开的6个功能,让你手机顺滑流畅,再用3年也不卡!...