Android 自定义SeekBar 实现分段显示不同背景颜色的示例代码
时间:2022-07-26
本文章向大家介绍Android 自定义SeekBar 实现分段显示不同背景颜色的示例代码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在最近的开发工作中,要实现一个调色板的进度条,SeekBar要分成10段显示不同颜色,功夫不负有心人,终于实现了这个功能,下面分享给大家 示例图:
1.自定义SeekBar
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.SeekBar;
/**
*
* @time 2020/6/4 18:32
* <p
* 类描述:自定义多颜色的SeekBar
*/
public class MulticolourSeekBar extends SeekBar {
/**
* 画笔
*/
private Paint mMulticlourPaint;
/**
* 刻度线的个数,等分数等于刻度线的个数加1
*/
private int mMulticlourCount = 9;
/**
* 每条刻度线的宽度
*/
private int mMulticlourWidth = 2;
/**
* 刻度线的颜色
*/
private int mMulticlourColor = Color.WHITE;
/**
* 滑块上面是否要显示刻度线
*/
private boolean isShowTopOfThumb = false;
public MulticolourSeekBar(Context context) {
super(context);
init();
}
public MulticolourSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MulticolourSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
/**
* 初始化
*/
private void init() {
//创建绘制刻度线的画笔
mMulticlourPaint = new Paint();
mMulticlourPaint.setColor(mMulticlourColor);
mMulticlourPaint.setAntiAlias(true);
//Api21及以上调用,去掉滑块后面的背景
if (Build.VERSION.SDK_INT = Build.VERSION_CODES.LOLLIPOP) {
setSplitTrack(false);
}
}
/**
* 重写onDraw方法绘制刻度线
*
* @param canvas
*/
@Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
//极限条件校验
if (getWidth() <= 0 || mMulticlourCount <= 0) {
return;
}
//获取每一份的长度
// int length = (getWidth() - getPaddingLeft() - getPaddingRight() - mMulticlourCount * mMulticlourWidth) / (mMulticlourCount + 1);
int length = (getWidth() - getPaddingLeft() - getPaddingRight()) / (mMulticlourCount + 1);
//计算刻度线的顶部坐标和底部坐标
int rulerTop = getHeight() / 2 - getMinimumHeight() / 2;
int rulerBottom = rulerTop + getMinimumHeight();
//获取滑块的位置信息
Rect thumbRect = null;
if (getThumb() != null) {
thumbRect = getThumb().getBounds();
}
//绘制刻度线
// for (int i = 1; i <= mMulticlourCount; i++) {
// //计算刻度线的左边坐标和右边坐标
// int rulerLeft = i * length + getPaddingLeft();
// int rulerRight = rulerLeft + mMulticlourWidth;
//
// //判断是否需要绘制刻度线
// if (!isShowTopOfThumb && thumbRect != null && rulerLeft - getPaddingLeft() thumbRect.left && rulerRight - getPaddingLeft() < thumbRect.right) {
// continue;
// }
//
// //进行绘制
// canvas.drawRect(rulerLeft, rulerTop, rulerRight, rulerBottom, mMulticlourPaint);
// }
for (int i = 0; i <= mMulticlourCount; i++) {
int left = getPaddingLeft() + i * length;
int right = left + length;
if (i % 3 == 0) {
mMulticlourPaint.setColor(Color.RED);
} else if (i % 3 == 1) {
mMulticlourPaint.setColor(Color.YELLOW);
} else {
mMulticlourPaint.setColor(Color.BLUE);
}
if (i == 0) {
canvas.drawCircle(getPaddingLeft() + 10, 20, 10, mMulticlourPaint);
left += 10;
canvas.drawRect(left, 10, right, 30, mMulticlourPaint);
} else if (i == mMulticlourCount) {
right -= 10;
canvas.drawRect(left, 10, right, 30, mMulticlourPaint);
canvas.drawCircle(right, 20, 10, mMulticlourPaint);
} else {
canvas.drawRect(left, 10, right, 30, mMulticlourPaint);
}
}
}
/**
* 设置刻度线的个数
*
* @param mRulerCount
*/
public void setRulerCount(int mRulerCount) {
this.mMulticlourCount = mRulerCount;
requestLayout();
}
/**
* 设置刻度线的宽度,单位(px)
*
* @param mRulerWidth
*/
public void setRulerWidth(int mRulerWidth) {
this.mMulticlourWidth = mRulerWidth;
requestLayout();
}
/**
* 设置刻度线的颜色
*
* @param mRulerColor
*/
public void setRulerColor(int mRulerColor) {
this.mMulticlourColor = mRulerColor;
if (mMulticlourPaint != null) {
mMulticlourPaint.setColor(mRulerColor);
requestLayout();
}
}
/**
* 滑块上面是否需要显示刻度线
*
* @param isShowTopOfThumb
*/
public void setShowTopOfThumb(boolean isShowTopOfThumb) {
this.isShowTopOfThumb = isShowTopOfThumb;
requestLayout();
}
}
2.activity_main.xml
<?xml version="1.0" encoding="utf-8"?
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
<com.xinrui.view.MulticolourSeekBar
android:id="@+id/seek_bar"
android:layout_width="350px"
android:layout_height="wrap_content"
android:background="@null"
android:maxHeight="20px"
android:minHeight="20px"
android:max="100"
android:progress="5"
android:progressDrawable="@drawable/shape_progress_drawable"
android:thumb="@drawable/shape_thumb_icon"
android:thumbOffset="-2px"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /
</android.support.constraint.ConstraintLayout
3.shape_progress_drawable.xml
<?xml version="1.0" encoding="utf-8"?
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
<item android:id="@android:id/background"
<shape
<solid android:color="#e1e8f0" /
<size android:height="8px" /
<corners android:radius="8px" /
</shape
</item
<item android:id="@android:id/progress"
<clip
<shape
<gradient
android:endColor="@android:color/transparent"
android:startColor="@android:color/transparent" /
<size android:height="8px" /
<corners android:radius="8px" /
</shape
</clip
</item
</layer-list
4.shape_thumb_icon.xml
<?xml version="1.0" encoding="utf-8"?
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
<size
android:width="5px"
android:height="40px" /
<solid android:color="@android:color/widget_edittext_dark" /
</shape
总结
到此这篇关于Android 自定义SeekBar 实现分段显示不同背景颜色的文章就介绍到这了,更多相关Android 自定义SeekBar 背景颜色内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- 几个行列转换的实用小例子(r4笔记第2天)
- History API与浏览器历史堆栈管理
- node中创建服务进程
- 数据挖掘工程师:如何通过百度地图API抓取建筑物周边位置、房价信息
- crontab导致CPU异常的问题分析及处理(r3笔记第100天)
- 短信接口被恶意调用(二)肉搏战-阻止恶意请求
- 关于首屏时间采集自动化的解决方案
- javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites
- 一次数据库无法登陆的问题及排查 (r3笔记第99天)
- 用深度学习keras的cnn做图像识别分类,准确率达97%
- 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本
- job处理缓慢的性能问题排查与分析(r4笔记第18天)
- 京东商品评论情感分析:数据采集与词向量构造方法
- springboot开启access_log日志输出
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 146. LRU缓存机制 Krains 2020-08-05 12:50:28 链表
- 337. 打家劫舍 III Krains 2020-08-05 10:18:45 动态规划
- 58道Vue常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度
- 记一次Linux计划任务cron无结果的排查过程
- 一文学会使用 CSS 中的 min(), max(), clamp() 以及它们的使用场景用例
- 5 个 JS 数组技巧可提高你的开发技能
- 一个有意思的方案:不借助后台和 JS ,只用 CSS 让一个列表编号倒序,你会怎么做?
- 关于MySQL LOAD DATA特性的利用与思考
- NHibernate 缓存
- 渗透测试 | 突破前端JS加密限制
- 使用 Task 简化异步编程
- Task 编程中的异常处理
- AngularJS 中的 factory、 service 和 provider
- 设计模式之适配器模式
- 设计模式之组合模式