自定义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 滑动条!
1536 0
Flutter 121: 图解简易 Slider 滑动条
|
6月前
|
Android开发
Android使用ViewPager实现图片轮播系列之三:手动滑动 + 左右箭头(1)
Android使用ViewPager实现图片轮播系列之三:手动滑动 + 左右箭头(1)
|
容器
PopupWindow(悬浮框)的基本使用
后一个用于显示信息的UI控件——PopupWindow(悬浮框),如果你想知道他长什么样子,你可以打开你手机的QQ,长按列表中的某项,这个时候后弹出一个黑色的小对话框,这种就是PopupWindow了,和AlertDialog对话框不同的是,他的位置可以是随意的; 另外AlertDialog是非堵塞线程的,而PopupWindow则是堵塞线程的!而官方有这样一句话来介绍PopupWindow: A popup window that can be used to display an arbitrary view. The popup window is a floating conta
159 0
|
前端开发 Android开发
自定义View实例(三)----滑动刻度尺与流式布局
最近在系统学习自定义View这一块的知识,前面几篇基本都是理论知识,这篇博客着重从实战来加强对自定义View的理解与运用。实现的两种效果,分别代表自定义View与自定义ViewGroup。
1306 0
|
vr&ar 图形学
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 。 包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助 Unity 将创意变成现实。 Unity 平台提供一整套完善的软件解决方案,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 也可以简单把 Unity 理解为一个游戏引擎,可以用来专业制作游戏!
【Unity3D 灵巧小知识点】☀️ | Unity UGUI组件Scroll View禁止 左右 或 上下 滑动
超酷Loading进度条
在线演示 本地下载
987 0
|
XML Android开发 数据格式
Android5.0新特性之——按钮点击效果动画(涟漪效果)
Android5.0 Material Design设计的动画效果 RippleDrawable涟漪效果       涟漪效果是Android5.0以后的新特性。为了兼容性,建议新建drawable-v21文件夹来存放RippleDrawable,drawable文件夹下也要放相应的适配图片。
4510 0
|
API Android开发
自定义Dialog之旅程(三)Dialog动画
上一章讲了dialog的大小,虽然写得有点乱,但是我觉得讲出了重点,这章讲讲动画吧,尽量简练谢,少写些内容,不然有的朋友看到字多就觉得烦,反正我看到字多我是真的会觉得烦。
917 0