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

相关文章

闲置电脑也能活出第二春?鲁大师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

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。