首页 文章 精选 留言 我的

精选列表

搜索[动画],共4256篇文章
优秀的个人博客,低调大师

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>

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册