一个酷炫的button变化动画开源库源码分析—Android morph Button(一)

2023-10-24 12:50

本文主要是介绍一个酷炫的button变化动画开源库源码分析—Android morph Button(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近很是喜爱一些酷炫的动画效果,特意在github上找了一些,看看他们是怎么做到的,做个分析,顺便可以对自定义控件和动画有进一步的认识。
先来看下这个库中button的变化效果是什么样的:

是的发送到

这里写图片描述

是不是很酷炫,而且中间的变化过程很舒服,没有僵硬的感觉,应用的场景也比较广:只要点击按钮,执行一个操作之后,返回结果,这个结果以对错表示,如果是一个耗时的操作还可以显示执行的进度,有很好的用户体验。比如点击按钮后,在后台进行下载、用户点击按钮进行登录等。

先分析第一个动画效果:
稍微复杂的动画一般是用属性动画来做了,对多个属性进行同时变化,仔细观察这个动画效果可以看到,有width的变化,由长方形变成了圆形,必然有CornerRadius的变化,变化的过程中背景颜色也有变化,最后显示通过和没通过的ICON,来看下ObjectAnimator使用的方法,target就是要变化的对象,propertyName就是要变化的属性,现在要变化的属性已经有了,就是上面说的:width、cornerRadius、color等,那么target应该是什么?

直接是button本身吗?我们知道某个属性变化(如color)是依据target中的setColor()方法来动态设置color的值,也就是button中药提供setColor()、setCornerRadius()这样的方法,来更新对应的值到界面上,一般最后还有调用invalidate()方法来刷新界面展示变化的效果。但是这样实现比较麻烦,这些方法都要我们自己提供。那么Android Morphing Button这个库是怎么做的呢?

其实我们想象这个button动画真的变化的其实就是它的background,这个库就是将backgroud设置为一个GradientDrawable,然后对这个GradientDrawable进行变化,也就事target就是这个GradientDrawable,GradientDrawable本身就有setColor、setCornerRadius、setStroke这些方法,并且会自动刷新UI,这样就不不用我们自己去写这些方法来重绘,大体的思路就是这样的,接下来分析具体的代码。

  public static ObjectAnimator ofInt(Object target, String propertyName, int... values)

1. 具体使用:

// sample demonstrate how to morph button to green circle with icon
MorphingButton btnMorph = (MorphingButton) findViewById(R.id.btnMorph);
// inside on click event
MorphingButton.Params circle = MorphingButton.Params.create().duration(500).cornerRadius(dimen(R.dimen.mb_height_56)) // 56 dp.width(dimen(R.dimen.mb_height_56)) // 56 dp.height(dimen(R.dimen.mb_height_56)) // 56 dp.color(color(R.color.green)) // normal state color.colorPressed(color(R.color.green_dark)) // pressed state color.icon(R.drawable.ic_done); // icon
btnMorph.morph(circle);

MorphingButton就是自定义的这个button,里面有个Params的静态内部类,设置一些参数如:cornerRadius、width,color等,表示变化到什么参数,Icon为结束的显示的图标。设置好参数后,就调用

 public void morph(@NonNull Params params) 

这个方法来执行动画,使用起来很是简单。

接下来看下这个库代码的构成,有下面几个类:

  1. StrokeGradientDrawable.class 这个类就是GradientDrawable就是属性动画要变化的对象,在GradientDrawable的基础上加入了stroke,radius,color的设置,提供了对应set和get方法。

  2. MorphingAnimation.class 这个类就是具体的动画变化类了。

  3. MorphingButton.class 这个类继承自button,在代码中设置background为StrokeGradientDrawable,这样对StrokeGradientDrawable做了属性变化后,动画效果就显示在button上了。

就按照这个顺序来分析具体的代码,先看StrokeGradientDrawable.class:

public class StrokeGradientDrawable {private int mStrokeWidth;private int mStrokeColor;private GradientDrawable mGradientDrawable;private float mRadius;private int mColor;public StrokeGradientDrawable(GradientDrawable drawable) {mGradientDrawable = drawable;}public int getStrokeWidth() {return mStrokeWidth;}public void setStrokeWidth(int strokeWidth) {mStrokeWidth = strokeWidth;mGradientDrawable.setStroke(strokeWidth, getStrokeColor());}public int getStrokeColor() {return mStrokeColor;}public void setStrokeColor(int strokeColor) {mStrokeColor = strokeColor;mGradientDrawable.setStroke(getStrokeWidth(), strokeColor);}public void setCornerRadius(float radius) {mRadius = radius;mGradientDrawable.setCornerRadius(radius);}public void setColor(int color) {mColor = color;mGradientDrawable.setColor(color);}public int getColor() {return mColor;}public float getRadius() {retu

这篇关于一个酷炫的button变化动画开源库源码分析—Android morph Button(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

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影

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get