关于安卓自定义类似于iOS系统自带的菊花loading

2023-11-03 22:40

本文主要是介绍关于安卓自定义类似于iOS系统自带的菊花loading,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

app加载数据一般都需要loading加载框,加载框的样式也是千千万万种,根据UI、需求而定,iOS系统自带的菊花loading简洁,也比较常用,下面自定义一个类似于iOS系统自带的菊花loading。

先上效果图:

使用方法

下面是完整代码:

public class LoadingView extends View {public LoadingView(Context context) {super(context);}public LoadingView(Context context, @androidx.annotation.Nullable AttributeSet attrs) {super(context, attrs);init();}public LoadingView(Context context, @androidx.annotation.Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private static final String TAG = LoadingView.class.getSimpleName();/*** view宽度*/private int width;/*** view高度*/private int height;/*** 菊花的矩形的宽*/private int widthRect;/*** 菊花的矩形的宽*/private int heightRect;/*** 菊花绘制画笔*/private Paint rectPaint;/*** 循环绘制位置*/private int pos = 0;/*** 菊花矩形*/private Rect rect;/*** 循环颜色*/private String[] color = {"#ffffff","#eeeeee","#dddddd","#cccccc","#bbbbbb", "#aaaaaa"};private void init() {rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);//根据个人习惯设置  这里设置  如果是wrap_content  则设置为宽高200if (widthMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.AT_MOST) {width = 200;} else {width = MeasureSpec.getSize(widthMeasureSpec);height = MeasureSpec.getSize(heightMeasureSpec);width = Math.min(width, height);}widthRect = width / 12;   //菊花矩形的宽heightRect = 4 * widthRect;  //菊花矩形的高setMeasuredDimension(width, width);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//绘制部分是关键了,菊花花瓣矩形有12个,我们不可能去一个一个的算出所有的矩形坐标,我们可以考虑//旋转下面的画布canvas来实现绘制,每次旋转30度//首先定义一个矩形if (rect == null) {rect = new Rect((width - widthRect) / 2, 0, (width + widthRect) / 2, heightRect);}//       0  1  2  3  4  5  6  7  8  9  10  11   i的值// ————————————————————————————————————————————————————————//  0   ‖ 0 | 1 | 2 | 3 | 4 | 5 | 5 | 5 | 5 | 5 | 5 | 5 ‖//  1   ‖ 5 | 0 | 1 | 2 | 3 | 4 | 5 | 5 | 5 | 5 | 5 | 5 ‖//  2   ‖ 5 | 5 | 0 | 1 | 2 | 3 | 4 | 5 | 5 | 5 | 5 | 5 ‖//  3   ‖ 5 | 5 | 5 | 0 | 1 | 2 | 3 | 4 | 5 | 5 | 5 | 5 ‖//  4   ‖ 5 | 5 | 5 | 5 | 0 | 1 | 2 | 3 | 4 | 5 | 5 | 5 ‖//  5   ‖ 5 | 5 | 5 | 5 | 5 | 0 | 1 | 2 | 3 | 4 | 5 | 5 ‖//  6   ‖ 5 | 5 | 5 | 5 | 5 | 5 | 0 | 1 | 2 | 3 | 4 | 5 ‖//  7   ‖ 5 | 5 | 5 | 5 | 5 | 5 | 5 | 0 | 1 | 2 | 3 | 4 ‖//  8   ‖ 4 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 0 | 1 | 2 | 3 ‖//  9   ‖ 3 | 4 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 0 | 1 | 2 ‖//  10   ‖ 2 | 3 | 4 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 0 | 1 ‖//  11   ‖ 1 | 2 | 3 | 4 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 0 ‖//  pos的值for (int i = 0; i < 12; i++) {if (i - pos >= 5) {rectPaint.setColor(Color.parseColor(color[5]));} else if (i - pos >= 0 && i - pos < 5) {rectPaint.setColor(Color.parseColor(color[i - pos]));} else if (i - pos >= -7 && i - pos < 0) {rectPaint.setColor(Color.parseColor(color[5]));} else if (i - pos >= -11 && i - pos < -7) {rectPaint.setColor(Color.parseColor(color[12 + i - pos]));}canvas.drawRect(rect, rectPaint);  //绘制canvas.rotate(30, width / 2, width / 2);    //旋转}pos++;if (pos > 11) {pos = 0;}postInvalidateDelayed(150);  //一个周期用时150}
}

这篇关于关于安卓自定义类似于iOS系统自带的菊花loading的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现