自定义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 androidx.appcompat.widget.AppCompatSeekBar;
import android.util.AttributeSet;/*** @author:ligc* @time 2022/12/06* <p>* 类描述:自定义SeekBar*/
public class CircleSeekBar extends AppCompatSeekBar {/*** 绘制的类型 0为圆点,1为刻度*/private int drawStyle = 1;/*** 是否绘制文字*/private boolean drawText = false;/*** 刻度线画笔*/private Paint mRulerPaint;/*** 圆点画笔*/private Paint mCirclePaint;/*** 字体画笔*/private Paint mTestPaint;/*** 绘制的个数,等分数等于刻度线的个数加1*/private int mCount = 10;/*** 每条刻度线的宽度*/private int mRulerWidth = 2;/*** 刻度线的颜色*/private int mRulerColor = Color.WHITE;/*** 圆点的颜色*/private int mCircleColor = Color.WHITE;/*** 字体的颜色*/private int mTextColor = Color.WHITE;/*** 滑块上面是否要显示*/private boolean isShowTopOfThumb = false;public CircleSeekBar(Context context) {super(context);init();}public CircleSeekBar(Context context, AttributeSet attrs) {super(context, attrs);init();}public CircleSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}/*** 初始化*/private void init() {//创建绘制刻度线的画笔mRulerPaint = new Paint();mRulerPaint.setColor(mRulerColor);mRulerPaint.setAntiAlias(true);//创建绘制圆点的画笔mCirclePaint = new Paint();mCirclePaint.setColor(mCircleColor);mCirclePaint.setAntiAlias(true);//创建绘制文字的画笔mTestPaint = new Paint();mTestPaint.setTextSize(35F);mTestPaint.setColor(mTextColor);mTestPaint.setAntiAlias(true);//Api21及以上调用,去掉滑块后面的背景if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {setSplitTrack(false);}}/*** 重写onDraw方法绘制刻度线** @param canvas*/@Overrideprotected synchronized void onDraw(Canvas canvas) {super.onDraw(canvas);//极限条件校验if (getWidth() <= 0 || mCount <= 0) {return;}//获取每一份的长度int length = 0;if (drawStyle==0){length = (getWidth()) / (mCount + 1);}else if (drawStyle==1){length = (getWidth() - getPaddingLeft() - getPaddingRight() - mCount * mRulerWidth) / (mCount + 1);}//计算刻度线的顶部坐标和底部坐标 注意绘制刻度的时候要设置minHeightint rulerTop = getHeight() / 2 - getMinimumHeight() / 2;int rulerBottom = rulerTop + getMinimumHeight();float drawY = (float) ((rulerTop+rulerBottom) / 2);float drawTestY = (float) ((rulerTop+rulerBottom) / 2) -50;//获取滑块的位置信息Rect thumbRect = null;if (getThumb() != null) {thumbRect = getThumb().getBounds();}int rulerLeft = 0 , rulerRight = 0;float drawX = 0 ;//绘制刻度线for (int i = 1; i <= mCount; i++) {//计算刻度线的左边坐标和右边坐标if (drawStyle==0){rulerLeft = i * length;rulerRight = rulerLeft ;drawX = (float) rulerLeft;}else if (drawStyle==1){rulerLeft = i * length + getPaddingLeft();rulerRight = rulerLeft + mRulerWidth;drawX = (float) ((rulerLeft+rulerRight)/2);}float drawTestX = (float) ((rulerLeft)-10);//判断是否需要绘制刻度线if (!isShowTopOfThumb && thumbRect != null && rulerLeft - getPaddingLeft() > thumbRect.left && rulerRight - getPaddingLeft() < thumbRect.right) {continue;}//进行绘制if (drawStyle==0){canvas.drawCircle(drawX, drawY, 8.0F, mCirclePaint);}else if (drawStyle==1){canvas.drawRect(rulerLeft, rulerTop, rulerRight, rulerBottom, mRulerPaint);}//是否绘制文字if (drawText){canvas.drawText(String.valueOf(i-1), drawTestX, drawTestY, mTestPaint);}}}/*** 设置绘制的个数** @param mCount*/public void setCount(int mCount) {this.mCount = mCount;requestLayout();}/*** 设置绘制类型** @param mStyle*/public void setDrawStyle (int mStyle) {this.drawStyle = mStyle;requestLayout();}/*** 设置是否绘制文字** @param drawText*/public void setDrawText (boolean drawText) {this.drawText = drawText;requestLayout();}/*** 设置刻度线的宽度,单位(px)** @param mRulerWidth*/public void setRulerWidth(int mRulerWidth) {this.mRulerWidth = mRulerWidth;requestLayout();}/*** 设置刻度线的颜色** @param mRulerColor*/public void setRulerColor(int mRulerColor) {this.mRulerColor = mRulerColor;if (mRulerPaint != null) {mRulerPaint.setColor(mRulerColor);requestLayout();}}/*** 设置圆点的颜色** @param mCircleColor*/public void setCircleColor(int mCircleColor) {this.mCircleColor = mCircleColor;if (mCirclePaint != null) {mCirclePaint.setColor(mCircleColor);requestLayout();}}/*** 设置字体的颜色** @param TextColor*/public void setTextColor(int TextColor) {this.mTextColor = TextColor;if (mTestPaint != null) {mTestPaint.setColor(mTextColor);requestLayout();}}/*** 设置整体颜色** @param mCircleColor,mTextColor*/public void setAllColor(int mCircleColor,int mTextColor) {//圆的颜色this.mCircleColor = mCircleColor;//字体的颜色this.mTextColor = mTextColor;if (mCirclePaint != null && mTestPaint != null) {mCirclePaint.setColor(mCircleColor);mTestPaint.setColor(mTextColor);requestLayout();}}/*** 滑块上面是否需要显示刻度线** @param isShowTopOfThumb*/public void setShowTopOfThumb(boolean isShowTopOfThumb) {this.isShowTopOfThumb = isShowTopOfThumb;requestLayout();}
}

在Main中调用


import androidx.appcompat.app.AppCompatActivity;import android.graphics.Color;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements CircleSeekBar.OnSeekBarChangeListener{private  CircleSeekBar mSeekBar;private  TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mSeekBar = (CircleSeekBar)findViewById(R.id.seek_bar);textView = (TextView)findViewById(R.id.tv_show);//设置相关属性值mSeekBar.setDrawStyle(0);mSeekBar.setCount(11);mSeekBar.setDrawText(true);mSeekBar.setAllColor(Color.WHITE,R.color.gray79);mSeekBar.setShowTopOfThumb(true);mSeekBar.setOnSeekBarChangeListener(this);}@Overridepublic void onProgressChanged(SeekBar seekBar, int i, boolean b) {if (seekBar.getProgress()<100){seekBar.setProgress(Math.round(seekBar.getProgress()/10)*10+5);}else {seekBar.setProgress(105);}textView.setText((seekBar.getProgress()-5)/10+"");}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}
}

相关xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"android:orientation="vertical"tools:context=".MainActivity"><com.ligc.demo.CircleSeekBarandroid:layout_gravity="center"android:id="@+id/seek_bar"android:layout_marginLeft="15dp"android:layout_marginRight="15dp"android:minHeight="16dp"android:splitTrack="false"android:max="110"android:progress="5"android:thumb="@drawable/shape_seekbar_circle"android:progressDrawable="@drawable/seekbar_bg"android:layout_width="match_parent"android:layout_height="80dp"tools:ignore="MissingConstraints" /><TextViewandroid:id="@+id/tv_show"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>

shape_seekbar_circle.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"><!-- 边 --><item><shape android:shape="oval"><paddingandroid:bottom="2dp"android:left="2dp"android:right="2dp"android:top="2dp" /><solid android:color="#50CCCCCC" /><corners android:radius="8dp" /><sizeandroid:width="30dp"android:height="30dp" /></shape></item><!-- 中心背景 --><item><shapeandroid:shape="oval"android:useLevel="false"><!-- 实心 --><solid android:color="#ffffff" /><corners android:radius="10dp" /><paddingandroid:bottom="10dp"android:left="10dp"android:right="10dp"android:top="10dp" /><sizeandroid:width="30dp"android:height="30dp" /></shape></item>
</layer-list>

seekbar_bg.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><corners android:radius="10dp"/><solid android:color="#DBEDF4"/></shape><!--    背景颜色--><color android:color="#CCCCCC"/></item><item android:id="@android:id/progress"><clipandroid:clipOrientation="horizontal"android:gravity="left"><shape><corners android:radius="10dp"/><!--  开始颜色,中途颜色,最后颜色--><gradientandroid:startColor="#FF0000"android:centerColor="#FFFF00"android:endColor="#00FF00"/></shape></clip></item>
</layer-list>

自定义圆点刻度可滑动的SeekBar,也可设置刻度相关推荐

  1. seekbar垂直放置_将刻度线对准Android SeekBar

    我试图在Android的SeekBar上放置一些刻度标记指示器.我能够生成带有刻度线的背景,但是我无法找到一种方法将刻度线与实际的SeekBar线对齐.从屏幕截图中可以看到,刻度线实际上在SeekBa ...

  2. android 自定义view滚动条,Android自定义View实现等级滑动条的实例

    Android自定义View实现等级滑动条的实例 实现效果图: 思路: 首先绘制直线,然后等分直线绘制点: 绘制点的时候把X值存到集合中. 然后绘制背景图片,以及图片上的数字. 点击事件down的时候 ...

  3. 自定义cell的左侧滑动

    效果如上图,中间那个白线是一个UIview. 如果不添加中间那根白线,用系统的方法就可以实现,方法如下 1 -(NSArray<UITableViewRowAction*>*)tableV ...

  4. excel怎么更改坐标轴刻度_excel数值坐标轴刻度(excel表格插入图表里坐标轴的刻度能自定义设置吗)...

    怎么让excel表格坐标轴表上刻度 解决案: 1.图拖鼠标选要建立图标数据 2.菜单栏:插入--图选择种式 3.插入图表先点击纵坐标轴选看坐标轴四周现四圆叫做控制点 4.右键单击坐标轴选择[设置坐标轴 ...

  5. JavaScript——网页轮播图( 实现点击小圆点、图片滑动、小圆点样式改变)

    一.轮播图要实现的效果: 实现点击小圆点.图片滑动.小圆点样式改变 二.轮播图实现效果步骤: 1.利用html+css完成轮播图片,底部小点的整体效果的布局. 2.通过原生js完成图片轮播,无缝自动切 ...

  6. android 带刻度的滑动条_android 滚轮刻度尺的实现

    遇到一个需求需要实现如下图的效果: 卷尺,通过左右滑动来选择不同的刻度值.这方面的东西以前没弄过,以目前你的能力,想了几种思路都死在了半路上.比如上面的刻度线如何弄,滑动的时候又该如何弄:下面的数字又 ...

  7. matplotlib绘制图表,设置刻度标签、最大最小刻度、字体大小,label位置、刻度轴箭头等

    matplotlib绘制图表,设置刻度标签.最大最小刻度.字体大小,label位置.刻度轴箭头等 1. 效果图 2. 源码 2.1 仅使用普通轴ax + fontdict 源码 2.2 使用mpl设置 ...

  8. 07_设置坐标轴刻度、设置刻度标签(Setting Tick Labels)、调整刻度标签 (Adjusting the ticklabels)

    7.设置刻度 7.1.设置坐标轴刻度 7.2.设置刻度标签(Setting Tick Labels) 7.3.调整刻度标签 (Adjusting the ticklabels) 7.设置刻度 7.1. ...

  9. echarts x轴像直尺一样设置刻度_MATLAB作图实例:6:指定轴刻度值和标签

    沿轴自定义刻度值和标签可以帮助突出显示数据的特定方面.本文示例显示了一些常见的自定义设置,例如,修改刻度值的位置,更改刻度标签的文本和格式以及旋转刻度标签. 更改刻度值位置和标签 将x创建为介于-10 ...

最新文章

  1. linux下删除乱码文件、目录
  2. python代码示例图形-Python画高斯分布图形实例代码
  3. Win64 驱动内核编程-2.基本框架(安装.通讯.HelloWorld)
  4. 5、kafka的操作
  5. BAT 批处理命令 - 获取时间并进行自定义年月日、时分秒格式实例演示
  6. python爬虫抓收费图片_简单的Python抓taobao图片爬虫
  7. html标签属性%= %,HTML标签属性集合
  8. [翻译] python Tutorial 之一
  9. 操作系统原理:进程 PV 操作如何计算?全网最全三种前驱图计算类型总结
  10. 计算机网络段标试卷,计算机网络基础-段标-第2章.ppt
  11. 机器学习介绍jc01
  12. https与http的区别
  13. opencv3中camshift详解(一)camshiftdemo代码详解
  14. 修改服务器的返回数据,使用charles 修改服务器返回数据
  15. python五子棋ai_零基础学Python之—AI五子棋(1)
  16. 免安装版的Mysql教程
  17. 11年北漂老码农转行!黯然离场...
  18. WordPress BuddyPress Extended Friendship Request插件跨站脚本漏洞
  19. MFC建立空文档失败分析
  20. python从入门到精通清华_java从入门到精通(第5版)+python从入门到精通+c语言从入门到精通 全3册 清华大学出版社...

热门文章

  1. 笔记本设置csgo分辨率设置
  2. Coursera的视频国内打不开,最新解决办法,截至2020.9依然有效
  3. 应用程序Activity窗口与WMS、AMS的通信分析(Android Q)
  4. Java中八种基本数据类型占用字节空间总结
  5. 如何在Excel表中使用Power BI的功能?
  6. 深入理解Java虚拟机:JVM内存管理与垃圾收集理论
  7. 【图像隐藏】基于DCT算法实现数字水印嵌入+检测+攻击含Matlab源码
  8. TDSQL-C 真·秒级启停:连接断了,又没断
  9. 【Linux驱动】Linux--V4L2视频驱动框架
  10. Hyper-V虚拟机/WSL/WSA镜像压缩