千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要为大家展示了"Android开发中如何自定义加载动画",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android开发中如何自定义加载动画"这篇
千家信息网最后更新 2026年11月02日Android开发中如何自定义加载动画

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

一、demo简介

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

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

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

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

R = minHeight /6

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

Cy = height/2

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

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

Cx = 3R

Cy =height/2

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

三、画圆

1.先创建一个类继承自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){}}

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

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

3. 在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    }

4.提供一个画笔

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

5.在onDraw方法里面画一个圆

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

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

  

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

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

8.重新计算一下半径

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        }    }

四、实现张嘴闭嘴动画

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

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

image.png

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

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

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

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

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

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

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

6.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)        }}

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

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

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

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

五、小球移动动画

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

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

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

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

3.之后,在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)        }

4.在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开发中如何自定义加载动画"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

动画 小球 方法 因子 大圆 半径 圆心 小圆 坐标 移动 内容 情况 界面 角度 开发 宽度 尺寸 按钮 效果 比例 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网 湖北九亚互联网络科技有限公司 云信互联网科技有限公司 深圳科技互联网 互联网科技上市公司 苏州大垚互联网科技 恒生科技互联网指数分析 海南科技产业互联网平台 汉立互联网科技有限公司联系电话 剑昆互联网络科技有限公司临桂 承德科技产业互联网发展 湖南诚度互联网科技有限公司 互联网对科技的发展 未来五年的互联网科技 科技类公司包括互联网吗 每天都有哪些好的互联网科技 产业互联网科技服务公司 富国互联网金融科技混合基金 互联网科技新闻 保山浩联互联网科技有限公司 中国互联网科技工作委员会毛军 互联网金融 科技 互联网 科技创业 安徽鑫晟辉互联网科技 互联网科技教育视频 亳州好赞互联网科技有限公司 云南互联网科技学费 科技美学互联网 艺术 恒生科技互联网指数十大成分股 知域互联网科技有限公司官网
0