一种加载动画的实现

记得看过上面的一个动画设计,就试着实现了一下,首先是可以看到这个动画由两部分组成,一个圆圈的顺时针转动,另一个是圆点的直线运动,圆点之间有时间差,两种运动叠加就形成了这种滚动的效果。



图一、图二、图三

上面图一显示了只有圆圈旋转的状态,图二是只有圆点直线运动的状态,图三是图二中各个圆点添加时间差后的效果。

实现

绘制点

这里一共有15个圆点,相位偏差是360/15=24?

for (int i = 0; i < POINT_NUM; ++i) {
    float x = mRadius * -(float) Math.sin(DEGREE * 24 * i);
    float y = mRadius * -(float) Math.cos(DEGREE * 24 * i);

    ArcPoint point = new ArcPoint(x, y, COLORS[i % 3]);
    mArcPoint[i] = point;
}

private final double DEGREE = Math.PI / 180;
private static final int POINT_NUM = 15;

ArcPoint是点的定义,包括位置和颜色

static class ArcPoint {
    float x;
    float y;
    int color;

    ArcPoint(float x, float y, int color) {
        this.x = x;
        this.y = y;
        this.color = color;
    }
}

绘制圆圈的旋转

可以固定点不动,通过旋转canvas来实现

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();
        canvas.translate(mCenter.x, mCenter.y);

        float factor = getFactor();
        canvas.rotate(36 * factor);
        float x, y;
        for (int i = 0; i < POINT_NUM; ++i) {
            mPaint.setColor(mArcPoint[i].color);
            // float itemFactor = getItemFactor(i, factor);
            x = mArcPoint[i].x;// - 2 * mArcPoint[i].x * itemFactor;
            y = mArcPoint[i].y;// - 2 * mArcPoint[i].y * itemFactor;
            canvas.drawCircle(x, y, mPointRadius, mPaint);
        }

        canvas.restore();
        if (mStartAnim) {
            postInvalidate();
        }
    }

这样就可以得到图一圆圈旋转的动画,这里固定了旋转角度36,如果是360就可以看到一个完整的旋转。

这里旋转角度为什么取36?看完整效果,其实每个点在直线移动后,转动1.5个相位偏差也就是24*1.5=36,就可以和其实点的图形重合,而且因为圆点的颜色每三个重复一次,所以经过36度的旋转,新圆点位置和动画开始状态看上去就是一样的。

给圆点添加起始偏移时间

每个点运动的起始时间是不同的,如果一起运动就会得到图二的效果,我们看怎么从总的时间得到每个圆点的运动时间,也就是

float itemFactor = getItemFactor(i, factor);
private float getItemFactor(int index, float factor) {
    float itemFactor = (factor - 0.66f / POINT_NUM * index) * 3;
    if (itemFactor < 0f) {
        itemFactor = 0f;
    } else if (itemFactor > 1f) {
        itemFactor = 1f;
    }
    return mInterpolator.getInterpolation(itemFactor);
}

这里设计每个点直线运动的时间是周期的1/3,那剩余的2/3=0.66就是从第一个点开始到最后一个点开始运动的时间,通过

factor - 0.66f / POINT_NUM * index

就可以得到每个圆点的起始时间,再*3将其换算到直线运动的时间上。

将上面的运动组合起来就得到了完整的onDraw方法

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();
        canvas.translate(mCenter.x, mCenter.y);

        float factor = getFactor();
        canvas.rotate(36 * factor);
        float x, y;
        for (int i = 0; i < POINT_NUM; ++i) {
            mPaint.setColor(mArcPoint[i].color);
            float itemFactor = getItemFactor(i, factor);
            x = mArcPoint[i].x - 2 * mArcPoint[i].x * itemFactor;
            y = mArcPoint[i].y - 2 * mArcPoint[i].y * itemFactor;
            canvas.drawCircle(x, y, mPointRadius, mPaint);
        }

        canvas.restore();
        if (mStartAnim) {
            postInvalidate();
        }
    }

Source code

源码在这里 https://github.com/Fichardu/CircleProgress

时间: 2024-08-29 12:34:20

一种加载动画的实现的相关文章

CSS 实现加载动画之二-圆环旋转

原文:CSS 实现加载动画之二-圆环旋转 上次简单的介绍了下如何用代码实现菊花旋转的加载动画,动画点击,这次继续我们的动画系列,实现另外一种加载动画,圆环旋转.与上次不同的是,菊花旋转是通过改变元素透明度来实现动画,这次因为考虑到元素叠加,加上元素本身带有背景色,如果改变透明度会影响效果,所以直接改变元素的背景颜色,加上适当的延时,就可以实现这种圆环的效果.动画实现的根本原理就是将每个需要变化的元素以及变化的过程分离出来. 所有的动画在chrome中调试,未考虑到兼容性以及性能问题,只是单纯的介

【Android自定义View实战】之仿百度加载动画,一种优雅的Loading方式

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53470872 本文出自[DylanAndroid的博客] Android自定义View实战之仿百度加载动画一种优雅的Loading方式 第一个仿百度加载动画用ObjectAnimator属性动画操作ImageView的属性方法实现 第二个仿百度加载动画第二种实现方式用ValueAnimator原生的ondraw方法实现 第三个扔球动画-水平旋转动画 第四个扔球动画-垂直旋转动

CSS3绘制8种超炫的加载动画

CSS3绘制8种超炫的加载动画     逛前端开发网站的时候,偶尔发现一组非常炫酷的CSS3加载动画,遂迫不及待的做个Demo保存下来. 这些加载动画用到了CSS3的旋转transform属性,颜色透明度设置和伪元素操作等CSS技术.奇妙的组合,产生了意想不到的效果. 1.上下起伏波动的加载动画: #loader1, #loader1:before, #loader1:after { background: #f2fa08; -webkit-animation: load1 1s infinit

Android动画Animation的两种加载执行方式

本文以简单的AlphaAnimation("淡入淡出(透明度改变)"动画)为例,简单的说明Android动画Animation的两种加载执行方法: (1) 直接写Java代码,制作Android动画. (2) 写XML配置文件,加载XML资源文件执行. 其实这两者是一致的.要知道,在Android中,凡是可以在XML文件完成的View,代码亦可完全写出来. 现在先给出一个Java代码完成的动画AlphaAnimation,AlphaAnimation功能简单,简言之,可以让一个View

28种CSS3炫酷加载动画特效

这是一组效果非常炫酷的纯CSS3 Loading加载动画特效.这组loading动画共有27种不同的效果.每一种loading动画都是通过CSS3的keyframes帧动画来完成的,每一个加载动画都构思新颖,效果非常的酷. 效果演示:http://www.htmleaf.com/Demo/201503301597.html 下载地址:http://www.htmleaf.com/css3/css3donghua/201503301596.html

两种数据加载动画

android 数据加载动画: <FrameLayout android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" > <RelativeLayout android:id="@+id/rl_loading" android:layout_width

ios 图片的两种加载方式

控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) [objc] view plaincopy + (UIImage *)imageNamed:(NSString *)name; 注:必须是png文件.需要把图片添加到 images.xcassets中 例如: [objc] view plaincopy @property (weak, nonatomic) IBOutlet UIImageView 

超酷jQuery进度条加载动画集合

在丰富多彩的网页世界中,进度条加载动画的形式非常多样,有利用gif图片实现的loading动画,也有利用jQuery和CSS3实现的进度加载动画,本文主要向大家介绍很多jQuery和CSS3实现的进度条加载动画,每一个都非常具有创意.如果你喜欢,可以下载源码并将它们应用到自己的网站中去. HTML5 Canvas发光Loading动画 它是一个Loading加载动画,并不能实现具体进度的加载,但是可以提示用户数据或者页面正在加载.并且该应用利用Canvas绘制动画,效果非常不错. DEMO演示 

Android实战页面内容加载动画

前言 文章开头来看一下本篇文章要实现的效果,如图 左边是慕课网APP中的效果,右边是58同城APP中的加载动画. 实现第一种动画 之前用图形的混合模式和贝塞尔曲线实现过慕课网的下拉刷新的加载动画.见链接慕课网app下拉刷新图标填充效果的实现,而这种动画效果在app中其实也很常见,之前的那篇文章是自定义View绘制出来的,其实这个也可以用DrawableAnimation实现,这里,我们来实现一下,看看有多简单.首先提取图片资源,图片提取自慕课网App,如图. 提取完图片之后就是编写Drawabl