Android自定义View第二弹(旋转的体重)

2024-01-25 15:30

本文主要是介绍Android自定义View第二弹(旋转的体重),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

个人开发中自定义View系列(有需要的可以点击查看收藏)

  1. Android自定义view第一弹(防小米计步)
  2. Android自定义View第二弹(旋转的体重)
  3. Android自定义View第三弹(反人类尺子)
  4. Android自定义View第四弹(Kotlin流式布局)

废话不多说先上图:

这里写图片描述

左下体重 (有旋转的动画)

废话不多说上代码:

一.自定义View代码

/*** Created by DYJ on 2017/9/21.*/public class MyCustomerView extends View{/**圆点画笔*/Paint pointPaint ;/**圆弧画笔*/Paint arcPaint ;/**图片画笔*/Paint bitmapPaint ;/**彩色画笔*/Paint shaderPaint ;/**自定义的Bitmap*/private Bitmap mBitmap;/**自定义的画布,目的是为了能画出重叠的效果*/private Canvas mCanvas;/**箭头图片*/Bitmap mArrowBitmap ;/**控件宽度*/int width ;/**控件高度*/int height ;/**圆弧外边半径*/int radius ;/**圆弧画笔宽度*/int paintWidth ;/**圆点间隔的角度*/float spaceAngle = 15;/**当前的角度*/float currentAgent = 90 ;/**当前百分比*/float currentPercent = 0 ;ValueAnimator valueAnimator ;private Matrix mMatrix;             // 矩阵,用于对图片进行一些操作// 默认的动效周期 2sprivate int defaultDuration = 2000;public MyCustomerView(Context context) {super(context);initView(context) ;}public MyCustomerView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initView(context);}public MyCustomerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context);}private void initView(Context context) {pointPaint = new Paint();pointPaint.setStrokeWidth(3);pointPaint.setColor(Color.WHITE);pointPaint.setAntiAlias(true);bitmapPaint = new Paint() ;bitmapPaint.setStyle(Paint.Style.FILL);bitmapPaint.setAntiAlias(true);shaderPaint = new Paint() ;mArrowBitmap = BitmapFactory.decodeResource(context.getResources(), R.mipmap.icon_zhizhen);mMatrix = new Matrix() ;}/*** 设置进度百分比* @param percent 百分比*/public void setPercent(float percent){//两边监测if (percent<1){percent=1;}else if (percent > 200){percent = 200;}currentPercent = percent ;valueAnimator = ValueAnimator.ofFloat(0,1f).setDuration(defaultDuration) ;valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float value = (float) animation.getAnimatedValue();currentAgent = value * currentPercent * 1.8f;invalidate();}});valueAnimator.start();}@Overrideprotected void onDraw(Canvas canvas) {width = getWidth() ;height = getHeight() ;paintWidth = width / 4 ;radius = width / 4 + paintWidth/2;mBitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888) ;mCanvas = new Canvas(mBitmap) ;drawPoint(mCanvas);arcPaint = new Paint() ;arcPaint.setStyle(Paint.Style.STROKE); //设置空心arcPaint.setStrokeWidth(paintWidth);arcPaint.setAntiAlias(true);arcPaint.setColor((Color.parseColor("#B9B9B9")));RectF rectF = new RectF(paintWidth/2,paintWidth/2, width - paintWidth/2 , width - paintWidth/2);canvas.drawArc(rectF,179,182,false,arcPaint); //绘制半圆底色mMatrix.reset();mMatrix.postTranslate(width / 2 - 90, radius + paintWidth/2 - 30 );   // 将图片绘制中心调整到与当前点重合mCanvas.rotate(currentAgent,width/2,radius + paintWidth/2);mCanvas.drawBitmap(mArrowBitmap,mMatrix,bitmapPaint);mCanvas.save();drawPercentColor(canvas,rectF) ;canvas.drawBitmap(mBitmap, 0, 0, null);}/*** 绘制过渡色背景* @param canvas* @param rectF*/private void drawPercentColor(Canvas canvas, RectF rectF) {shaderPaint.setAntiAlias(true);shaderPaint.setStyle(Paint.Style.STROKE);shaderPaint.setStrokeWidth(paintWidth);shaderPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));//shaderPaint.setColor(yellowColor);SweepGradient sweepGradient = new SweepGradient(width/2,radius + paintWidth/2 + 10,new int[]{Color.parseColor("#ccffff"),Color.parseColor("#00ff99"),},new float[] { 0, 1F,}) ;shaderPaint.setShader(sweepGradient) ;canvas.drawArc(rectF,179, currentAgent + 2,false,shaderPaint);}private void drawPoint(Canvas canvas) {for (int i = 0 ; i <= 10 ; i ++){canvas.save() ;canvas.rotate(i * spaceAngle - 89.5f + spaceAngle, width/2 , paintWidth/2 + radius);canvas.drawCircle(width/2 , paintWidth/2,8,pointPaint);canvas.restore();}}
}

再给你们一个指针的图,免得说我不够大方

这里写图片描述

二.自定义View用法

MyCustomerView myCustomerView;
//记得findViewById()
myCustomerView.setPercent(66.45);/这里暴露了作者的体重

三.加到布局里面这个不用我多说了吧,大家都会

好的,今天的旋转体重到此结束,欢迎收看下一篇

Android自定义View第三弹(反人类尺子)

这篇关于Android自定义View第二弹(旋转的体重)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643705

相关文章

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio