自定义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
相关文章
|
XML 测试技术 Android开发
Android开发之View动画
Android动画主要分为3种 View动画 帧动画 属性动画 何为View动画? View动画主要是对View对象进行变换所达到的动画效果,如平移、缩放、旋转和透明度等,下面写个简单案例。
940 0
超酷Loading进度条
在线演示 本地下载
1014 0
|
前端开发 JavaScript
改变extjs的window在modal下,背景由半透明变为全透明
在ext\resources\css目录下,编辑ext-all.css文件,文件首部:html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin...
840 0
|
编解码 Android开发 数据格式
自定义View系列教程08--滑动冲突的产生及其处理
探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多...
1124 0
|
XML Android开发 数据格式
Android5.0新特性之——按钮点击效果动画(涟漪效果)
Android5.0 Material Design设计的动画效果 RippleDrawable涟漪效果       涟漪效果是Android5.0以后的新特性。为了兼容性,建议新建drawable-v21文件夹来存放RippleDrawable,drawable文件夹下也要放相应的适配图片。
4538 0
|
API Android开发
自定义Dialog之旅程(三)Dialog动画
上一章讲了dialog的大小,虽然写得有点乱,但是我觉得讲出了重点,这章讲讲动画吧,尽量简练谢,少写些内容,不然有的朋友看到字多就觉得烦,反正我看到字多我是真的会觉得烦。
946 0
|
Android开发 数据格式 XML
|
Android开发 API
Android学习Scroller(三)——控件平移划过屏幕 (Scroller简单使用)
PS: 该篇博客已经deprecated,不再维护,详情请参见  站在源码的肩膀上全解Scroller工作机制  http://blog.csdn.net/lfdfhl/article/details/53143114 MainActivity如下: package cc.
849 0
|
开发者
Flutter小球弹跳动画
Flutter 的动画系统可以帮助开发者实现生动的游戏效果,例如物理效果、平移动画、旋转动画等等。以下是一个使用 Flutter 动画系统实现小球弹跳的示例代码
Flutter小球弹跳动画
|
Android开发 数据格式 XML
Android项目实战(三十二):圆角对话框Dialog
原文:Android项目实战(三十二):圆角对话框Dialog 前言:   项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框。         对话框包括:1、圆角         2、app图标 , 提示文本,关闭对话框的"确定"按钮   难点:1、对话框边框圆角显示 ...
1110 0

热门文章

最新文章