当前位置: 首页 > 编程笔记 >

Android 自定义SeekBar 实现分段显示不同背景颜色的示例代码

申屠项明
2023-03-14
本文向大家介绍Android 自定义SeekBar 实现分段显示不同背景颜色的示例代码,包括了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 背景颜色内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题内容: 因此,我看到我们可以使用具有灰色和白色(当setinverse …时)背景色的Alertdialog。 要了解为什么我检查了sdk的themes.xml,检查了它是否导致了可绘制对象,并且在那里我意识到alertdialog背景不是以编程方式完成的,而是通过一些图像完成的。这些图像保证了当我们使用LayoutInflater设置不同的背景色时,对话框的顶部(标题区域)和底部(按钮区域上

  • 问题内容: 我正在尝试使用以下方法将状态栏背景色填充为橙色 但是,我从下面的示例中得到一个白色的状态栏,该栏应该用橙色填充:快速自定义导航栏外观 我在 didFinishLaunchingWithOptions* 方法下的 AppDelegate.swift 文件中进行设置,以将其应用于整个应用程序。 * 我已经将 info.plist 编辑为以下内容: 有人知道我在做什么错吗? 编辑:我不确定是

  • 因此,我正在编写一个程序,在这个程序中,我最终希望一个按钮在按下时改变颜色。到目前为止,我的困境是: -尽管切换了setOpaque()和setContentAreaFilled()的真/假,但我无法获取当前设置为显示背景色的JButton。在尝试添加ActionListener之前,我希望能够做到这一点。 -我想用类似于JToggleButton()的东西来改变颜色,但是我想用背景而不是图标来改

  • 问题内容: 我有这个课: 问题是当我在JList中选择一个单元格时,我的背景不会变成红色。setText部分有效,但是我无法弄清楚为什么它不会更改单元格的背景颜色。任何人都有任何想法,谢谢! 问题答案: 主要问题是标签默认情况下是不透明的,因此您需要使标签不透明才能绘制背景。 但是您不需要为此创建自定义渲染器。默认渲染器是不透明的。您所需要做的就是设置列表的选择背景属性: 如果您尝试创建一个渲染器

  • 本文向大家介绍js点击列表文字对应该行显示背景颜色的实现代码,包括了js点击列表文字对应该行显示背景颜色的实现代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js点击列表文字,实现该行文字显示背景颜色的方法。分享给大家供大家参考。具体如下:  JS控制li,鼠标点击时class自动加上,给列表文字产生自己喜欢的背景色的网页特效。   运行效果图如下: 希望本文所述对大家的javascr

  • 我最近在我的Windows 10计算机上安装了Android Studio,我正在尝试解决内置终端中的背景色不协调问题。此处为屏幕截图。当我在Ubuntu 14.04上使用Android Studio时,我没有遇到过这个问题。 文本背景的颜色是黑色,而控制台背景的颜色是白色。这个问题与我使用Git Bash作为终端无关,因为当我使用Windows命令提示符时也会出现这个问题。 我已经检查了设置——

  • 本文向大家介绍PopupWindow自定义位置显示的实现代码,包括了PopupWindow自定义位置显示的实现代码的使用技巧和注意事项,需要的朋友参考一下 一、概述 在Android中弹出式菜单(以下称弹窗)是使用十分广泛的一种菜单呈现方式,弹窗为用户交互提供了便利。关于弹窗的实现大致有以下两种方式AlertDialog和PopupWindow,当然网上也有使用Activity并配合Dialog主

  • 本文向大家介绍JS实现在页面随时自定义背景颜色的方法,包括了JS实现在页面随时自定义背景颜色的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS实现在页面随时自定义背景颜色的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的javascript程序设计有所帮助。