豆瓣加载动画实现

最终效果如下

ValueAnimator类API 简介

  • ofFloat(float… values) 构建ValueAnimator,设置动画的浮点值,需要设置2个以上的值

  • setDuration(long duration) 设置动画时长,默认的持续时间为300毫秒。

  • setInterpolator(TimeInterpolator value) 设置动画的线性非线性运动,默认AccelerateDecelerateInterpolator

  • addUpdateListener(ValueAnimator.AnimatorUpdateListener listener) 监听动画属性每一帧的变化

分解步骤,计算一下总共需要的角度:
1、一个笑脸,x轴下方的圆弧旋转135°,覆盖2个点,此过程中圆弧增加45°
2、画布旋转135°,此过程中圆弧增加45°
3、画布旋转360°,此过程中圆弧减少360/5度
4、画布旋转90°,此过程中圆弧减少90/5度
5、画布旋转135°,释放覆盖的2个点

实现

package com.zj.test;import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.DecelerateInterpolator;/*** Created by jjx on 2016/5/28.*/
public class customView extends View{//    public customView(Context context, AttributeSet attrs, int defStyleAttr) {
//        super(context, attrs, defStyleAttr);
//
//        initAnimator(animatorDuration);
//        mPaint=new Paint();
//        mPaint.setStyle(Paint.Style.STROKE);//设置画笔样式为描边,如果已经设置,可以忽略
//        mPaint.setColor(Color.GREEN);
//        mPaint.setStrokeWidth(10);
//    }float Width;float Height;public customView(Context context, AttributeSet attrs) {super(context, attrs);initAnimator(animatorDuration);mPaint=new Paint();mPaint.setStyle(Paint.Style.STROKE);//设置画笔样式为描边,如果已经设置,可以忽略mPaint.setColor(Color.GREEN);mPaint.setStrokeWidth(10);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);Width=MeasureSpec.getSize(widthMeasureSpec);mViewWidth=Width;Height=MeasureSpec.getSize(heightMeasureSpec);}Paint mPaint;float mViewWidth;@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.translate(Width/2,Height/2);doubanAnimator(canvas, mPaint);}private ValueAnimator animator;private float animatedValue;private long animatorDuration = 5000;private TimeInterpolator timeInterpolator = new DecelerateInterpolator();private void initAnimator(long duration){if (animator !=null &&animator.isRunning()){animator.cancel();animator.start();}else {animator=ValueAnimator.ofFloat(0,855).setDuration(duration);animator.setInterpolator(timeInterpolator);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {animatedValue = (float) animation.getAnimatedValue();invalidate();}});animator.start();}}private void doubanAnimator(Canvas canvas, Paint mPaint){mPaint.setStyle(Paint.Style.STROKE);//描边mPaint.setStrokeCap(Paint.Cap.ROUND);//圆角笔触mPaint.setColor(Color.rgb(97, 195, 109));mPaint.setStrokeWidth(15);float point = Math.min(mViewWidth,mViewWidth)*0.06f/2;float r = point*(float) Math.sqrt(2);RectF rectF = new RectF(-r,-r,r,r);canvas.save();// rotateif (animatedValue>=135){canvas.rotate(animatedValue-135);}// draw mouthfloat startAngle=0, sweepAngle=0;if (animatedValue<135){startAngle = animatedValue +5;sweepAngle = 170+animatedValue/3;}else if (animatedValue<270){startAngle = 135+5;sweepAngle = 170+animatedValue/3;}else if (animatedValue<630){startAngle = 135+5;sweepAngle = 260-(animatedValue-270)/5;}else if (animatedValue<720){startAngle = 135-(animatedValue-630)/2+5;sweepAngle = 260-(animatedValue-270)/5;}else{startAngle = 135-(animatedValue-630)/2-(animatedValue-720)/6+5;sweepAngle = 170;}canvas.drawArc(rectF,startAngle,sweepAngle,false,mPaint);// draw eyecanvas.drawPoints(new float[]{-point,-point,point,-point},mPaint);canvas.restore();}}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.zj.test.MainActivity"><com.zj.test.customView
        android:layout_width="match_parent"android:layout_height="match_parent"></com.zj.test.customView>
</RelativeLayout>

参考链接

自定义View——Canvas与ValueAnimator – Idtk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金山笔试题-字符串排序 : 写一个函数,实现对给定的字符串(字符串里面包括:英文字母,数字,符号)的处理...

写一个函数&#xff0c;实现对给定的字符串&#xff08;字符串里面包括&#xff1a;英文字母&#xff0c;数字&#xff0c;符号&#xff09;的处理。经过处理后的字符串其内容按字母&#xff0c;数字&#xff0c;符号的顺序存放。函数声明如下&#xff1a;void ParseString(cha…

下一次 IT 变革:边缘计算(Edge computing)

来源&#xff1a;云头条摘要&#xff1a;外媒 ZDnet 发布了此篇边缘计算领域的重要文章&#xff0c;详细分析了各机构不同的定义、市场状况、前景等&#xff0c;经编译&#xff0c;供各位参考数十亿物联网设备和5G网络这两股力量必将推动计算工作负载的部署方式发生深远而重大的…

WebService入门

webservice 的概念&#xff0c;解决什么问题&#xff1f; webservice 就是一个应用程序&#xff0c;它提供一种通过web 方式访问的api. 解决两个系统或者&#xff08;应用程序&#xff09;之间的远程调用….. 调用是跨语言&#xff0c;跨平台… webservice 最基本的组成部分…

LoadRunner常见问题

1.LoadRunner录制脚本时为什么不弹出IE浏览器&#xff1f; 当一台主机上安装多个浏览器时, LoadRunner 录制脚本经常遇到不能打开浏览器的情况&#xff0c;可以用下面的方法来解决。 启动浏览器&#xff0c;打开Internet选项对话框&#xff0c;切换到高级标签&#xff0c;去掉&…

Google联手Facebook 要在AI研究上搞什么大事?

来源&#xff1a;网易智能 摘要&#xff1a;Google和Facebook宣布&#xff0c;使开源机器学习框架PyTorch与Tensor-Processing Units&#xff08;TPU&#xff09;进行合作。这种伙伴关系标志着人工智能研究合作进入新时代。“今天&#xff0c;我们很高兴地宣布&#xff0c;Goog…

WebService之CXF框架

本文主要包括以下内容 ant工具的使用利用cxf实现webservicecxf与spring整合 ajax访问webservice ant 工具 1、为什么要用到ant这个工具呢&#xff1f; Ant做为一种工具已经广泛被使用&#xff0c;并且历史悠久。 使用ant的内置命令&#xff0c;可以编译java源文件(javac)…

Java之IO操作总结

所谓IO&#xff0c;也就是Input与Output的缩写。在java中&#xff0c;IO涉及的范围比较大&#xff0c;这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是&#xff1a; 字符流字节流 其中&#xff0c;字符流有两个抽象类&…

谷歌无人车离奇车祸曝光:人类安全员睡着后,误触关闭了自动驾驶

来源&#xff1a;量子位离奇&#xff0c;真离奇。一场已经被掩盖数月的谷歌无人车&#xff08;Waymo&#xff09;离奇车祸&#xff0c;刚刚被The Information曝光。车祸的发生地&#xff0c;就在距离谷歌加州山景城总部不远的高速公路上。那是一个六月的早晨。一辆Waymo无人车正…

强烈推荐:240多个jQuery插件

概述 jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) &#xff0c;这是其它的 js 库所不及的&#xff0c;它兼容 CSS3&#xff0c;还兼容各种浏览器&#xff08;IE 6.0, FF 1.5, Safari 2.…

揭秘|超乎想象!未来50年将出现的九大黑科技……

来源&#xff1a;世界科技创新论坛Insititute for the Future是一家专门做预测的研究机构。该机构的首席研究总监Mark Frauenfelder详细描述了人类在未来能够用上&#xff0c;而今天却仍被认为不可能发生的事物。赶快一起来看看这些未来将出现的黑科技吧。1、大脑移植&#xff…

Android手绘效果实现

效果图 原理 大概介绍一下实现原理。首先你得有一张图&#xff08;废话~&#xff09;,接下来就是把这张图的轮廓提取出来&#xff0c;轮廓提取算法有很多&#xff0c;本人不是搞图像处理的&#xff0c;对图像处理感兴趣的童鞋可以查看相关资料。如果你有好的轮廓提取算法&…

干货|120页精华PPT详解工业机器人本体设计运算及仿真

来源&#xff1a;哈尔滨工业大学摘要&#xff1a;120页精华PPT详解工业机器人本体设计运算及仿真未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体…

屌丝程序员的那些事(一)-毕业那年

我叫郭子&#xff0c;桂北人&#xff0c;排行老三&#xff0c;出生在一个如谢娜描述“马栏山、马栏坡、马栏村”般偏远的农村。懂事起就听父母说三岁的时候生病被同村的赤脚误诊打错药水差点膈屁&#xff0c;之后父母一直担心我无法像同龄人一般健康成长&#xff0c;直到以后见…

环信SDK集成

利用环信SDK可以实现即时通讯&#xff0c;但在集成的过程中碰到了不少的坑。 注意 选择项目路径&#xff0c;这里以最新版环信demo为例 注意&#xff1a;环信的ChatDemoUI这个demo里边因为研发的同事为了照顾老版本的AndroidStudio使用者&#xff0c;已经用eclipse生成了bui…

协作机器人先驱宣布倒闭!累计融资10.3亿元,贝佐斯投资八轮

来源&#xff1a;量子位一家机器人领域的头部玩家&#xff0c;还不是说倒下就倒下了。上个月&#xff0c;协作机器人的先驱Rethink Robotics刚刚宣布出售第2500个机器人产品&#xff0c;而昨天&#xff0c;就又宣布关门大吉了。CEO Scott Eckert在接受外媒The Robot Report采访…

文件内容替换 :SED 命令 和 Perl

Linux文件内容替换 Perl 把文件file.txt中的before改为after perl -pi -e s/before/after/g file.txt -p 表示匹配文件的每一行 -i 表示把替换的结果写回到原文件 -e 表示后面的程序都写在一行上 SED $ sed -i s/ugly/beautiful/g /home/bruno/old-friends/sue.txt -i 记录…

YOLOv8改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)

一、本文介绍 本文给大家带来的改进机制是MSDA&#xff08;多尺度空洞注意力&#xff09;发表于今年的中科院一区(算是国内计算机领域的最高期刊了)&#xff0c;其全称是"DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition"。MSDA的主要思想是…

FragmentPagerAdapter实现刷新

在fragmentpageadapter的instantiateItem方法里&#xff0c;他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragmentpageadapter的getItem方法获取一个fragment。所以你更新fragments集合是没有作用的。 所以要用新的方法实现刷新功…

贝索斯专访:亚马逊帝国大规模业务转型的秘诀

来源&#xff1a;机器之能摘要&#xff1a;这篇文章简明、清晰地揭示出这家似乎没有边界、无拘束公司成功「转身」背后的逻辑与秘诀。与美国的其它科技业巨头不同&#xff0c;亚马逊并没有一个总的企业园区。在其全球的 57.5 万名雇员中&#xff0c;有 4.5 万名员工和管理人员位…

Oracle Stream Replication技术

Stream 是Oracle 的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用。 Oracle 的消息队列是通过发布/订阅的方式来解决事件管理。流复制(Stream replication)只是基于它的一个数据共享技术&#xff0c;也可以被用作一个可灵活定制的高可用性方案。 它可以实现两个数据库…