先上图

可以点击交叉点,和滑动来选择,下面是代码,不是很难,就是练习一下。

package com.zjsc.zjscapp.widget;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;import com.zjsc.zjscapp.R;
import com.zjsc.zjscapp.utils.SizeUtils;import java.util.ArrayList;
import java.util.List;/*** 作者:Android_AJ on 2017/4/10.* 邮箱:ai15116811712@163.com* 版本:v1.0* 仿微信设置字体大小的view* 自定义属性有:1.一共多少格 2.线条颜色与粗细 3.圆的半径和颜色*/
public class SetTextSizeView extends View {private int defaultLineColor = Color.rgb(33, 33, 33);private int defaultLineWidth;private int defaultMax = 5;private int defaultCircleColor = Color.WHITE;private int defaultCircleRadius;private int defaultPosition = 1;// 一共有多少格private int max = 5;// 线条颜色private int lineColor;// 线条粗细private int lineWidth;// 突出部分的线条高度private int lineHeight;// 圆半径private int circleRadius;private int circleColor;// 一段的宽度,根据总宽度和总格数计算得来private int itemWidth;// 控件的宽高private int height;private int width;// 当前所在位置private int currentProgress = defaultPosition;// 画笔private Paint mLinePaint;private Paint mCirclePaint;// 滑动过程中x坐标private float currentX = 0;// 有效数据点private List<Point> points = new ArrayList<>();private float circleX;private float circleY;public SetTextSizeView(Context context) {this(context, null);}public SetTextSizeView(Context context, AttributeSet attrs) {super(context, attrs);init(context, attrs);}private void init(Context context, AttributeSet attrs) {// initDefaultdefaultLineWidth = SizeUtils.dp2px(context, 2);defaultCircleRadius = SizeUtils.dp2px(context, 35);lineColor = Color.rgb(33, 33, 33);lineWidth = SizeUtils.dp2px(context, 2);circleColor = Color.WHITE;// initCustomAttrsTypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SetTextSizeView);final int N = typedArray.getIndexCount();for (int i = 0; i < N; i++) {initCustomAttr(typedArray.getIndex(i), typedArray);}typedArray.recycle();// 初始化画笔mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);mLinePaint.setColor(lineColor);mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE);mLinePaint.setStrokeWidth(lineWidth);mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);mCirclePaint.setColor(circleColor);mCirclePaint.setStyle(Paint.Style.FILL);// 设置阴影效果setLayerType(LAYER_TYPE_SOFTWARE, null);mCirclePaint.setShadowLayer(2, 0, 0, Color.rgb(33, 33, 33));}private void initCustomAttr(int attr, TypedArray typedArray) {if (attr == R.styleable.SetTextSizeView_lineColor) {lineColor = typedArray.getColor(attr, defaultLineColor);} else if (attr == R.styleable.SetTextSizeView_circleColor) {circleColor = typedArray.getColor(attr, defaultCircleColor);} else if (attr == R.styleable.SetTextSizeView_lineWidth) {lineWidth = typedArray.getDimensionPixelSize(attr, defaultLineWidth);} else if (attr == R.styleable.SetTextSizeView_circleRadius) {circleRadius = typedArray.getDimensionPixelSize(attr, defaultCircleRadius);} else if (attr == R.styleable.SetTextSizeView_totalCount) {max = typedArray.getInteger(attr, defaultMax);}}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);height = h;width = w;circleY = height / 2;lineHeight = height / 4;// 横线宽度是总宽度-2个圆的半径itemWidth = (w - 2 * circleRadius) / max;// 把可点击点保存起来for (int i = 0; i <= max; i++) {points.add(new Point(circleRadius + i * itemWidth, height / 2));}}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 先画中间的横线canvas.drawLine(points.get(0).x, height / 2, points.get(points.size() - 1).x, height / 2, mLinePaint);// 绘制刻度for (Point point : points) {canvas.drawLine(point.x, height / 2 - lineHeight, point.x, height / 2 + lineHeight, mLinePaint);}// 画圆if (canMove) {// 随手指滑动过程if (currentX < circleRadius) {currentX = circleRadius;}if (currentX > width - circleRadius) {currentX = width - circleRadius;}circleX = currentX;} else {// 最终circleX = points.get(currentProgress).x;}// 实体圆canvas.drawCircle(circleX, circleY, circleRadius, mCirclePaint);}float downX = 0;private boolean canMove = false;@Overridepublic boolean onTouchEvent(MotionEvent event) {// 过滤掉不合法的坐标
//        if (event.getX() < circleRadius || event.getX() > width - circleRadius) {
//            return false;
//        }switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 判断是否是数据点downX = event.getX();canMove = isDownOnCircle(downX);break;case MotionEvent.ACTION_MOVE:if (canMove) {currentX = event.getX();invalidate();}break;case MotionEvent.ACTION_UP:// 手指抬起之后就圆就不能在非有效点currentX = 0;float upX = event.getX();if (canMove) {// 是滑动过来的,要判断距离哪个有效点最近,就滑动到哪个点Point targetPoint = getNearestPoint(upX);if (targetPoint != null) {invalidate();}} else {if (Math.abs(downX - upX) < 30) {Point point = isValidPoint(upX);if (point != null) {invalidate();}}}if (onPointResultListener != null) {onPointResultListener.onPointResult(currentProgress);}downX = 0;canMove = false;break;}return true;}/*** 滑动抬起之后,要滑动到最近的一个点那里** @param x* @return*/private Point getNearestPoint(float x) {for (int i = 0; i < points.size(); i++) {Point point = points.get(i);if (Math.abs(point.x - x) < itemWidth / 2) {currentProgress = i;return point;}}return null;}/*** 判断是否点击到圆上** @param x* @return*/private boolean isDownOnCircle(float x) {return Math.abs(points.get(currentProgress).x - x) < circleRadius;}/*** 判断是否是有效的点击点** @param x*/private Point isValidPoint(float x) {for (int i = 0; i < points.size(); i++) {Point point = points.get(i);if (Math.abs(point.x - x) < 30) {currentProgress = i;return point;}}return null;}public void setOnPointResultListener(OnPointResultListener onPointResultListener) {this.onPointResultListener = onPointResultListener;}private OnPointResultListener onPointResultListener;public interface OnPointResultListener {void onPointResult(int position);}
}

包括了5个自定义的属性

    <!--设置字体大小控件--><declare-styleable name="SetTextSizeView"><attr name="lineWidth" format="dimension|reference" /><attr name="lineColor" format="color|reference" /><attr name="totalCount" format="integer" /><attr name="circleColor" format="color|reference" /><attr name="circleRadius" format="dimension|reference" /></declare-styleable>

完整代码在这里:https://github.com/aijie1712/DragChooseView,有需要的可以看下。。。

仿微信设置字体大小控件相关推荐

  1. Android 仿微信语音录音小控件

    Android 仿微信语音录音小控件 前段时间一直在做IM聊天这方面的撸码工作,涉及到了很多小控件,有时间我会慢慢给大家分享一下我的小成果,希望大家一起学习,一起进步,今天来和大家来说一下Androi ...

  2. java 头像 微信群_仿微信群头像九宫格控件 LQRNineGridImageView

    软件介绍 仿微信群头像九宫格控件 一.简介: 参照Android 仿微信群聊头像文章学习开发的一个仿微信群头像九宫格控件,感谢博主Loften_93663469. 效果如下: 二.使用: 1.在自己项 ...

  3. php支付密码控件,Android高仿微信支付密码输入控件实例代码

    这篇文章主要为大家详细介绍了Android高仿微信支付密码输入控件的具体实现代码,供大家参考,具体内容如下 像微信支付密码控件,在app中是一个多么司空见惯的功能.最近,项目需要这个功能,于是乎就实现 ...

  4. android 设置文字大小控件

    自定义设置文字大小控件 1.效果图 2.自定义文字设置控件 public class TextSizeSelector extends View {private int margingLeft;pr ...

  5. Android全局修改字体大小,Android 仿微信全局字体大小调整

    image 目录 一.前言 二.效果预览 三.实现步骤 1.自定义字体调整控件 2.滑动按钮改变当前页面预览字体大小 3.返回时,保存放大倍数并重启应用 4.初始化应用时配置字体放大倍数. 四.Dem ...

  6. Android初学二之仿微信APP实现RecyclerView控件的设计开发,实现点击事件及图片瀑布流

    目录 0 实验环境 1 界面展示 2 功能说明 3 核心代码 3.1 实现RecyclerView控件的设计开发 3.2 添加了文字库assets 3.3 实现点击事件对item中的每个LinearL ...

  7. 解决h5 开发 ,设置手机字体大小微信设置字体大小 页面变形问题

    1 https://www.cnblogs.com/luoyihao/p/12385975.html 1 ios系统: body{ -webkit-text-size-adjust: 100% !im ...

  8. uniapp开发的微信公众号,微信设置字体大小或者关怀模式,页面布局字体大小不受影响的解决方法

    在uniapp的app.vue的script标签内添加以下代码 (function(){//安卓端function handleFontSize () {// 设置网页字体为默认大小WeixinJSB ...

  9. 模仿微信九宫格图片展示控件

    主题 仿微信九宫格图片展示控件 github地址:点击打开链接 使用方法以及源码都在github上面

  10. 设置ListCtrl列表控件其中某一行的字体和背景颜色

    设置ListCtrl列表控件其中某一行的字体和背景颜色,可以最终达到如下效果: 操作步骤如下所示: 1.先添加一个自定义消息 ON_NOTIFY ( NM_CUSTOMDRAW,IDC_V_H264_ ...

最新文章

  1. ArrayListLinkedList 性能比较
  2. C语言检测大气成分,自动化结构健康监测
  3. 算法练习day8——190326(队列实现栈、栈实现队列)
  4. Sql Server 在数据库中所有表所有栏位 找出匹配某个值的脚本(转)
  5. 大型企业网络配置系列课程详解(四) --HSRP和VRRP配置与相关概念的理解(一)...
  6. 惠普打印机怎么无线连接电脑_惠普SPECTRE X360 13笔记本电脑怎么样,值得买吗
  7. (转)程序员的十层楼11层(上帝)
  8. MongoDB 问题123
  9. python post上传大文件分片上传_基于七牛 用python实现分片上传 创建文件报错701...
  10. Unity 编辑器知识(—)如何绘制色块
  11. 火山安卓定义全局变量【博客教学】
  12. nsis升级包_NSIS制作软件升级安装包完整教程
  13. 使用Java和eclipse进行XML文件解析20180812_韩信之
  14. 薛定谔方程编译成python码并画出电子轨道
  15. Brain Predicted Age (二)
  16. 看完你就明白的锁系列之自旋锁
  17. 福利来了 | 开发者社区布道师计划,奖品丰厚
  18. Python逐行读取tsv文件
  19. 大数据处理算法--Bloom Filter布隆过滤
  20. 大三,请问现在自学Java还来得及吗?

热门文章

  1. matlab 神经网络设计多层隐含层_MATLAB计算多层隐含层BP神经网络
  2. [Android Studio] 添加Override/Implement methods
  3. python-opencv2利用 cv2.findContours()函数来查找检测物体的轮廓
  4. ps无法在此计算机上,电脑上ps打不开的解决方法
  5. N卡和A卡有什么区别?A卡和N卡的区别,一个动图秒懂
  6. java lua脚本_在Java中使用Lua脚本语言
  7. wim linux u盘启动,在U盘启动中安装CDLinux
  8. python处理mp4视频提取音频转为mp3或者wav,并进行截取
  9. 发卡源码php,PHP发卡源码|荔枝发卡系统2.0
  10. 高等数学:8.2 数量积、向量积、混合积