自定义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
相关文章
|
前端开发 Android开发
自定义View实例(三)----滑动刻度尺与流式布局
最近在系统学习自定义View这一块的知识,前面几篇基本都是理论知识,这篇博客着重从实战来加强对自定义View的理解与运用。实现的两种效果,分别代表自定义View与自定义ViewGroup。
1309 0
|
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.
7579 0
超酷Loading进度条
在线演示 本地下载
989 0
|
XML Android开发 数据格式
实战 | 使用揭露动画(Reveal Effect)做一个丝滑的Activity转场动画
提笔之际(附总体思路) 最近跟几个小伙伴在实践一个项目,考虑到界面效果,我们决定使用揭露动画作为Activity的转场动画。 这里主要是我负责这部分的实现。
1524 0
|
XML Android开发 数据格式
Android5.0新特性之——按钮点击效果动画(涟漪效果)
Android5.0 Material Design设计的动画效果 RippleDrawable涟漪效果       涟漪效果是Android5.0以后的新特性。为了兼容性,建议新建drawable-v21文件夹来存放RippleDrawable,drawable文件夹下也要放相应的适配图片。
4513 0
|
前端开发 Android开发 Rust
Android - 条纹进度条实现,调整view宽度仿进度条
相关代码请参阅: https://github.com/RustFisher/aboutView/blob/master/app/src/main/java/com/rust/aboutview/activity/RoundCornerActivity.java 美工同学指定了一个进度条样式 这斑斓的进度条,如果要自己画实在是劳民伤财。
3243 0
|
前端开发 Android开发
01.自定义View(ArcView弧形进度条)
开始重新学习一下自定义View的相关知识,借鉴了一些网上的文章,目前在跟这位博主学习,大家可以关注一下 作者:红橙Darren 链接:https://www.
1119 0