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

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s