iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android开发中如何自定义加载动画
  • 278
分享到

Android开发中如何自定义加载动画

2023-06-29 09:06:24 278人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“Android开发中如何自定义加载动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发中如何自定义加载动画”这篇文章吧。一、demo简介效果展示如下图,

这篇文章主要为大家展示了“Android开发中如何自定义加载动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发中如何自定义加载动画”这篇文章吧。

一、demo简介

效果展示如下图,我截了三个瞬间,但其实这是一个连续的动画,就是这个大圆不停地吞下小圆。

Android开发中如何自定义加载动画

这个动画可以拆分为两部分,首先是大圆张嘴闭嘴的动画,相当于画一个圆弧,规定一下它的角度就好。小圆就是一个从右向左移动的动画。然后不停地刷新界面,让动画的持续时间为永恒,这样就会有一个持续的动态效果。

二、分析贪吃动画的尺寸比例

在制作动画之前,我们要先建一个模型,来确定一下大圆和小圆的比例。这个比例是自己设置的,可以自行修改。下图是画布的宽度大于高度的情况。

R = minHeight /6

Cx = (width - minwidth)/2 + 3R

Cy = height/2

Android开发中如何自定义加载动画

还有一种是画布宽度小于高度的情况,如下图所示:这个时候

6R+0.5R+2R = minwidth。 R = minwidth /8.5

Cx = 3R

Cy =height/2

Android开发中如何自定义加载动画

确定了大圆圆心坐标之后,小圆的圆心坐标也可以知道了。

三、画圆

先创建一个类继承自view,并实现其对应的构造方法

class MouseLoadingView : View {    constructor(context: Context):super(context){}    constructor(context: Context,attrs:AttributeSet?):super(context,attrs){}    constructor(context: Context,attrs:AttributeSet?,style:Int):super(context,attrs,style){}}

定义一下大圆(嘴)的半径(3R),小圆的半径(R)以及两圆之间的间距(0.5R),还有嘴的圆心坐标

 //嘴的半径    private var mouseRadius = 0f    //小圆的半径    private var ballRadius = 0f    //嘴和小球的间距    private var space = 0f //嘴的圆心    private var cx = 0f    private var cy = 0f

在onSizeChanged方法里面计算尺寸。

 override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {       if(measuredWidth>=measuredHeight){           ballRadius= measuredHeight/6f            cx = (measuredWidth-8.5f*ballRadius)/2 + 3*ballRadius        }else{           ballRadius= measuredWidth/8.5f            cx = 3*ballRadius.toFloat()        }        mouseRadius = 3*ballRadius        space = ballRadius/2f        cy = measuredHeight/2f    }

提供一个画笔

//画笔    private val mPaint = Paint().apply {        style = Paint.Style.FILL        color = context.resources.getColor(R.color.colorAccent,null)    }

在onDraw方法里面画一个圆

override fun onDraw(canvas: Canvas?) { canvas?.drawCircle(cx,cy,mouseRadius,mPaint)}

在xml文件里面添加这个自定义类

  <com.example.loadinganim.MouseLoadingView        android:id="@+id/loadingView"        android:layout_width="100dp"        android:layout_height="100dp"        app:layout_constraintBottom_toBottomOf="parent"        app:layout_constraintEnd_toEndOf="parent"        app:layout_constraintHorizontal_bias="0.498"        app:layout_constraintStart_toStartOf="parent"        app:layout_constraintTop_toTopOf="parent"        app:layout_constraintVertical_bias="0.11" />

如果用上面的方法来画圆,会出现一些bug,如下图所示

Android开发中如何自定义加载动画

这是因为,当宽度大于高度时,R= height/6。如果R过小,那么圆心的坐标就会偏左,那么就会有一部份圆出界。为了避免这种情况发生,无论什么情况下,都把R设置为最小的那个/8.5。

重新计算一下半径

override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {        super.onSizeChanged(w, h, oldw, oldh)        //计算尺寸        //小球的半径       ( Math.min(measuredHeight,measuredWidth)/8.5f ).also {r->            ballRadius = r            //嘴的半径            mouseRadius = 3*r            //嘴和小球的间距            space = r/2            //嘴的圆心            cx = ((measuredWidth- 8.5*r)/2 + 3*r).toFloat()            cy = measuredHeight/2f        }    }

四、实现张嘴闭嘴动画

张嘴相当于画了一个弧,画弧需要确定一个矩形区域&mdash;&mdash;即大圆所在的矩形。还需要设置一个角度,也就是弧度。绘制出来如下图所示。

override fun onDraw(canvas: Canvas?) { canvas?.drawArc(            cx-mouseRadius,            cy-mouseRadius,            cx+mouseRadius,            cy+mouseRadius,           45f,270f,true,mPaint        )}

Android开发中如何自定义加载动画

image.png

这是一个静态的过程,想让它变成动态的话,只需要一直修改嘴张开的角度即可。所以我们定义一个动画因子,作为弧度

 //嘴张开的角度 - >张嘴的动画因子     private var mouseAngle = 0f

然后在onDraw方法里面,把死数据改为我们动画因子即可。

canvas?.drawArc(           cx-mouseRadius,           cy-mouseRadius,           cx+mouseRadius,           cy+mouseRadius,           mouseAngle,360-2*mouseAngle,true,mPaint       )

添加两个按钮,来显示动画和暂停动画。当点击按钮时,实现对应的点击事件。

所以在MouseLoadingView类里面提供几个方法给外部调用

    }    //提供给外部使用    //显示动画    fun show(){     createAnimator()        start()    }    //隐藏动画    fun hide(){      stop()    }

createAnimator()是创建动画的函数。从0-45-0的是动画因子的变化,监听一下动画执行的过程,不断刷新动画因子的数值,然后刷新界面。

private fun createAnimator() {    ValueAnimator.ofFloat(0f, 45f, 0f).apply {            duration = 650            repeatCount = ValueAnimator.INFINITE            addUpdateListener {                mouseAngle = it.animatedValue as Float                //刷新界面                invalidate()            }            animators.add(this)        }}

因为动画效果有很多,所以我们要用一个数组来保存所有的动画

  //保存所有的动画对象    private var animators = mutableListOf<ValueAnimator>()

添加几个启动和结束动画的方法

//启动动画    private fun start(){        for(anim in animators){            anim.start()        }    }//暂停动画    private fun stop(){    for(anim in animators){        anim.end()    }

五、小球移动动画

创建一个小球,然后让它从右边向左边移动即可。小球圆心的x坐标在不断改变,y坐标与大圆一样。所以我们要给小球设置一个移动的动画因子。

//小球移动的动画因子    private var ballTranslateX = 0f

然后在onDraw()方法里面绘制小球

//绘制小球canvas?.drawCircle(cx+ballTranslateX,cy,ballRadius,mPaint)

之后,在createAnimator()方法里面添加小球的动画。让小球移动的距离从4.5R到0,也就是直到小圆与大圆重合。

 ValueAnimator.ofFloat(4.5f*ballRadius, 0f).apply {            duration = 650            repeatCount = ValueAnimator.INFINITE            addUpdateListener {                ballTranslateX = it.animatedValue as Float                //刷新界面                invalidate()            }            animators.add(this)        }

在MainActivity里面添加按钮的点击事件

class MainActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        startBtn.setOnClickListener{            loadingView.show()            pauseView.show()        }        stopBtn.setOnClickListener {            loadingView.hide()            pauseView.hide()        }    }}

差不多就这些内容。自定义加载动画的难点,主要在于找到动画因子。

以上是“Android开发中如何自定义加载动画”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android开发中如何自定义加载动画

本文链接: https://www.lsjlt.com/news/324045.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android开发中如何自定义加载动画
    这篇文章主要为大家展示了“Android开发中如何自定义加载动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发中如何自定义加载动画”这篇文章吧。一、demo简介效果展示如下图,...
    99+
    2023-06-29
  • Android开发之自定义加载动画详解
    目录一、demo简介二、分析贪吃动画的尺寸比例三、画圆四、实现张嘴闭嘴动画五、小球移动动画一、demo简介 1.效果展示如下图,我截了三个瞬间,但其实这是一个连续的动画,就是这个大圆...
    99+
    2024-04-02
  • Android中怎么自定义加载圈动画效果
    这篇文章给大家介绍Android中怎么自定义加载圈动画效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体代码如下:package blog.csdn.net.mchenys.myanimationload...
    99+
    2023-05-30
    android
  • Android如何自定义加载圈
    本篇内容介绍了“Android如何自定义加载圈”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!<RelativeLayout ...
    99+
    2023-07-02
  • 详解Android Flutter如何自定义动画路由
    目录简介自定义跳转使用flutter动画基础实现一个自定义的route总结简介 flutter中有默认的Route组件,叫做MaterialPageRoute,一般情况下我们在flu...
    99+
    2023-05-16
    Android Flutter自定义动画路由 Flutter自定义动画路由 Android Flutter 动画
  • Android开发中如何自定义editText下划线
    这篇文章主要介绍“Android开发中如何自定义editText下划线”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android开发中如何自定义editText下划线”文章能帮助大家解决问题。效果...
    99+
    2023-07-05
  • Android自定义加载框效果
    本文实例为大家分享了Android自定义加载框效果的具体代码,供大家参考,具体内容如下 效果图 菊花图标(mipmap-xxhdpi) 加载框圆角背景drawable <...
    99+
    2024-04-02
  • Android SeekBar如何自定义thumb旋转动画效果
    这篇文章给大家分享的是有关Android SeekBar如何自定义thumb旋转动画效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。示例dimens.xml为方便管理,可以添加一些尺寸设置<dimen&n...
    99+
    2023-06-25
  • Vue页面加载完成后如何自动加载自定义函数
    目录页面加载完成后自动加载自定义函数createdmountedvue之自执行函数页面加载完成后自动加载自定义函数 created 在模板渲染成html前调用,即通常初始化某些属性值...
    99+
    2024-04-02
  • Android自定义View实现气泡动画
    本文实例为大家分享了Android自定义View实现气泡动画的具体代码,供大家参考,具体内容如下 一、前言 最近有需求制作一个水壶的气泡动画,首先在网上查找了一番,找到了一个文章:A...
    99+
    2024-04-02
  • 详解Android如何实现自定义的动画曲线
    目录前言Curve 类定义实例解析正弦动画曲线总结前言 最近在写动画相关的篇章,经常会用到 Curve 这个动画曲线类,那这个类到底怎么实现的?如果想自己来一个自...
    99+
    2024-04-02
  • Android自定义仿ios加载弹窗
    本文实例为大家分享了Android自定义仿ios加载弹窗的具体代码,供大家参考,具体内容如下 效果如下: IosLoadDialog类(可直接复制): public class...
    99+
    2024-04-02
  • Android自定义加载圈的方法
    本文实例为大家分享了Android自定义加载圈的具体代码,供大家参考,具体内容如下 <RelativeLayout xmlns:android="http://schemas...
    99+
    2024-04-02
  • Android自定义定时闹钟开发
    本文实例为大家分享了Android开发之自定义闹钟实现,供大家参考,具体内容如下 闹钟时间设置及显示 闹钟的布局很简单,就是一个简单时间设置,所以自己写一个简单的布局按钮之类的也可以...
    99+
    2024-04-02
  • Android开发中如何实现自定义ProgressBar的样式
    Android开发中如何实现自定义ProgressBar的样式?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。样式资源:progressbar_bg.xml,放在...
    99+
    2023-05-31
    android gr progressbar
  • Adnroid 自定义ProgressDialog加载中(加载圈)
    前两天在做项目的时候发现有时候在访问网络数据的时候由于后台要做的工作较多,给我们返回数据的时间较长,所以老大叫我加了一个加载中的logo图用来提高用户体验.于是就在网上找了许多大神写的案例,再结合自己的情况完成了一个Loading工具类效果...
    99+
    2023-05-31
    android progressdialog gr
  • css3中如何定义动画
    小编给大家分享一下css3中如何定义动画,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用css3中的“@keyframes”规则来定义动画。“@keyframe...
    99+
    2023-06-14
  • Android开发中自定义editText下划线
    看了下网上代码: 我想要的效果如下图 下划线和文字有15dp的间距   eeeeee的颜色 上代码, <"1.0" encoding="utf-8">...
    99+
    2023-03-08
    EditText设置下划线 EditText自定义下划线 Android如何自定义EditText下划线
  • Android中怎么自定义新闻加载页面
    本篇文章给大家分享的是有关Android中怎么自定义新闻加载页面,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先的定义三个布局,为什么是三个,因为unkonw与loading...
    99+
    2023-05-30
    android
  • Android SeekBar 自定义thumb旋转动画效果
    目录简介示例dimens.xmldrawableshape_thumb_round_1.xmllayers_thumb_ring_sweep_1.xmlrotate_thumb_1....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作