SweepLoadingView-延时动画

这两天写了一个关于延时加载的控件,之前一直是用的 ProgressWheel, 后来参考了 lovejjfg 这个控件设计思路还是很巧妙的。不会用作图工具,凑合着看吧。

SweepLoadingView.png

怎么用?

<pre>
<github.alex.sweeploadingview.SweepLoadingView
xmlns:SweepLoadingView="http://schemas.android.com/apk/res-auto"
android:layout_width="112dp"
android:layout_height="112dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="72dp"
SweepLoadingView:slv_circleColor="#795548"
SweepLoadingView:slv_circleWidth="8dp"
SweepLoadingView:slv_duration="1200"
SweepLoadingView:slv_gapAngle="30"
SweepLoadingView:slv_strokeCap="square" />

</pre>

效果图

001.gif

奉上源码

<pre>
package github.alex.sweeploadingview;
/**
* 作者:Alex
*

* 时间:2016/8/24 16:31
*

* 博客地址:http://www.jianshu.com/users/c3c4ea133871/subscriptions
*

*

*/
public class SweepLoadingView extends View {
private RectF rectF;
private Paint paint;
private int circleColor;
private int circleWidth;
private int strokeCap;
/**
* 扫描一周 需要的时间
*/
private int swipeDuration;
/**
* 起点的角度
*/
private float startAngle;
/**
* 扫描的角度
*/
private float sweepAngle;

/\*\*
 \* 终点 和 起点的间隔 角度
 \*/
private float gapAngle;
/\*\*
 \* 起始点的偏移量
 \*/
private float startAngleOffset;
private ObjectAnimator sweepObjectAnimator;
private ObjectAnimator startAngleObjectAnimator;
/\*\*
 \* 扫描一周
 \*/
private boolean isSweepRepeat;

public SweepLoadingView(Context context) {
    super(context);
    initView(null);
}

public SweepLoadingView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initView(attrs);
}

private void initView(AttributeSet attrs) {
    startAngleOffset = 0;
    isSweepRepeat = false;
    initObjectAnimation();
}

private void initObjectAnimation() {
    sweepObjectAnimator = ObjectAnimator.ofFloat(this, new AngleProperty(Float.class, "sweepAngle"), 360F - gapAngle \* 2);
    sweepObjectAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
    sweepObjectAnimator.setDuration(swipeDuration);
    sweepObjectAnimator.setRepeatCount(Integer.MAX_VALUE);
    sweepObjectAnimator.setRepeatMode(ValueAnimator.RESTART);
    sweepObjectAnimator.addListener(new SweepAngleAnimatorListener());

    startAngleObjectAnimator = ObjectAnimator.ofFloat(this, new AngleProperty(Float.class, "startAngle"), 360F);
    startAngleObjectAnimator.setInterpolator(new LinearInterpolator());
    startAngleObjectAnimator.setDuration(1500);
    startAngleObjectAnimator.setRepeatCount(Integer.MAX_VALUE);
    startAngleObjectAnimator.setRepeatMode(ValueAnimator.RESTART);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    int min = Math.min(w, h);
    int dWidth = circleWidth / 2;
    rectF.left = dWidth;
    rectF.right = min - dWidth;
    rectF.top = dWidth;
    rectF.bottom = min - dWidth;
}

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
    canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
    float startAngle = this.startAngle - startAngleOffset;
    float sweepAngle = this.sweepAngle;
    if (isSweepRepeat) {
        startAngle += sweepAngle;
        sweepAngle = 360 - sweepAngle - gapAngle;
    } else {
        sweepAngle += gapAngle;
    }
    canvas.drawArc(rectF, startAngle, sweepAngle, false, paint);
}

private void startSweepAnimation() {
    if (!sweepObjectAnimator.isStarted()) {
        LogUtil.e("开始");
        sweepObjectAnimator.start();
    }
    if (!startAngleObjectAnimator.isStarted()) {
        startAngleObjectAnimator.start();
    }
}

private void stopSweepAnimation() {
    LogUtil.e("停止");
    sweepObjectAnimator.cancel();
    startAngleObjectAnimator.cancel();
}

private final class SweepAngleAnimatorListener extends SimpleAnimatorListener {
    @Override
    public void onAnimationRepeat(Animator animation) {
        handleSweepRepeat();
    }
}

/\*\*
 \* 处理扫描一周的 情况
 \*/
private void handleSweepRepeat() {
    if (isSweepRepeat) {
        startAngleOffset = (startAngleOffset + gapAngle \* 2) % 360;
    }
    isSweepRepeat = !isSweepRepeat;
}

private final class AngleProperty extends Property<SweepLoadingView, Float> {
    private String name;

    public AngleProperty(Class<Float> type, String name) {
        super(type, name);
        this.name = name;
    }

    @Override
    public Float get(SweepLoadingView object) {
        if ("sweepAngle".equals(name)) {
            return object.getSweepAngle();
        } else {
            return object.getStartAngle();
        }
    }

    @Override
    public void set(SweepLoadingView object, Float value) {
        if ("sweepAngle".equals(name)) {
            object.setSweepAngle(value);
        } else {
            object.setStartAngle(value);
        }
    }
}

private float getSweepAngle() {
    return sweepAngle;
}

private void setSweepAngle(float sweepAngle) {
    this.sweepAngle = sweepAngle;
    invalidate();
}

private float getStartAngle() {
    return startAngle;
}

private void setStartAngle(float startAngle) {
    this.startAngle = startAngle;
    invalidate();
}

}

</pre>

优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/620246

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。