自定义View实战 | 弹跳的loading效果

简介: 自定义View实战 | 弹跳的loading效果
本文完整项目代码敬请见GitHub
  • app加载中状态,有图片上下跳动,并每跳一次换一张图片
  • 首先准备几张图片
思路
  • 这个控件应该派生自ImageView类,这样才能方便地更改它的源文件内容;
  • 实现上下移动的效果:

利用ValueAnimator实时产生一个0~100的数值,
让当前图片的位置实时向上移动ValueAnimator的动态值的高度即可。

  • 要让图片的位置实时向上移动,

就需要先拿到初始状态下图片的位置。
每次控件被布局时
都会调用
onLayout(boolean changed,int left,int top,int right,int bottom)函数,
其中的参数left、top、right、bottom就是当前控件的位置。

通过重写onLayout()函数,我们可以拿到控件的初始高度mTop
之后在每次ValueAnimator的动态值到来时,
计算出当前控件的top位置,并将控件移动到这个位置就可以了。

实现
  • 自定义一个控件LoadingImageView,派生自ImageView,

重写onLayout()函数,拿到控件的初始top值
**(onLayout()函数只在一开始创建Activity的时候调用了一次而已,
后面我们是通过ValueAnimator来改变高度值,
没有调用到onLayout()函数)**

  • init() 函数中,创建并初始化ValueAnimator实例:

通过(mTop-dx)得到当前控件相对初始坐标上移dx距离后的最新坐标点;
通过setTop(int top)函数将控件移动到当前位置。

  • getTop()和setTop(int top)函数所得到的和设置的坐标

都是相对父控件的坐标位置。

  • 监听动画的开始和重复。

当动画开始时,图片设置为imagetest1.jpg;
在重复时,每重复一次更换一张图片。

public class LoadingImageView extends ImageView {

    private int mTop;

    //当前动画图片索引
    private int mCurImgIndex = 0;

    //动画图片总张数
    private static int mImgCount = 3;

    public LoadingImageView(Context context) {
        super(context);
        init();
    }

    public LoadingImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LoadingImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        mTop = top;
    }

    private void init() {
        ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100, 0);
        valueAnimator.setRepeatCount(valueAnimator.RESTART);
        valueAnimator.setRepeatCount(valueAnimator.INFINITE);
        valueAnimator.setDuration(2000);
        valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer dx = (Integer) animation.getAnimatedValue();
                setTop(mTop - dx);
            }
        });

        valueAnimator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                setImageDrawable(getResources(). getDrawable(R.drawable.imagetest1));
            }

            @Override
            public void onAnimationEnd(Animator animation) {

            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {
                mCurImgIndex++;
                switch (mCurImgIndex % mImgCount) {
                    case 0:
                        setImageDrawable(getResources(). getDrawable(R.drawable.imagetest1));
                        break;

                    case 1:
                        setImageDrawable(getResources(). getDrawable(R.drawable.imagetest2));
                        break;

                    case 2:
                        setImageDrawable(getResources(). getDrawable(R.drawable.imagetest3));
                        break;
                }
            }
        });

        valueAnimator.start();
    }
}
  • 使用控件并运行
case 5:
                LoadingImageView loadingImageView = new LoadingImageView(this);

                ll_nextParent.addView(loadingImageView, layoutParams);
                break;
  • 完整项目代码敬请见GitHub
相关文章
Flutter 121: 图解简易 Slider 滑动条
0 基础学习 Flutter,第一百二十一步:简单学习 Slider 滑动条!
1455 0
Flutter 121: 图解简易 Slider 滑动条
swiper轮播-可支持触摸滑动(整理)
swiper轮播-可支持触摸滑动(整理)
swiper轮播-可支持触摸滑动(整理)
|
前端开发 Android开发
自定义View实例(三)----滑动刻度尺与流式布局
最近在系统学习自定义View这一块的知识,前面几篇基本都是理论知识,这篇博客着重从实战来加强对自定义View的理解与运用。实现的两种效果,分别代表自定义View与自定义ViewGroup。
1289 0
|
API Android开发
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
144 0
【Android 内存优化】自定义组件长图组件 ( 长图滚动区域解码 | 手势识别 GestureDetector | 滑动计算类 Scroller | 代码示例 )
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
|
XML Android开发 数据格式
Android动画一:Activity过渡动画详细实现原理
虽然 Android 5.0 之后推出了新的过渡动画方式,但通常只是用于特定的场合使用,activity.overridePendingTransition() 通用方式的过渡动画还是很常用。 原理分析 startActivity(Intent(this,SecondActivity::class.
7512 0
超酷Loading进度条
在线演示 本地下载
979 0
|
前端开发 Android开发
01.自定义View(ArcView弧形进度条)
开始重新学习一下自定义View的相关知识,借鉴了一些网上的文章,目前在跟这位博主学习,大家可以关注一下 作者:红橙Darren 链接:https://www.
1109 0
|
前端开发
关于UGUI中Canvas无法移动的解决方法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37027464/article/details/78300869 关...
1349 0
|
API Android开发
自定义Dialog之旅程(三)Dialog动画
上一章讲了dialog的大小,虽然写得有点乱,但是我觉得讲出了重点,这章讲讲动画吧,尽量简练谢,少写些内容,不然有的朋友看到字多就觉得烦,反正我看到字多我是真的会觉得烦。
895 0