这是第二个

这里展示了两个不同大小的View效果,当然真正的三体几乎是没有规律的

思路

1、根据View的宽高计算三个小球的初始位置

我这里是根据宽高比重计算小球的位置,先确定中间位置,为了增加容错性,三个小球的直径最大为View宽度的5/6,并且最大为Vieww高度的4/5;左右小球的圆心距离中间小球的圆心是一个小球的直径大小。 使用drawCircle绘制出来,效果是这样

2、使用属性动画计算小球的位置和半径变化大小

我使用属性动画,改变一个rate的成员变量,使他从0到3匀速变化大小,0~1,1~2,2~3,分别对应小球运动的三个状态:左->中,中->右,右->左。

rate数值0~1

小球 位置变换
球1 左->中
球2 中->右
球3 右->左

rate数值1~2

小球 位置变换
球1 中->右
球2 右->左
球3 左->中

rate数值2~3

小球 位置变换
球1 右->左
球2 中->右
球3 中->右
    /*** 记录三个小球的初始位置* Body记录小球参数的内部实体类*/private Body[] originalBodys = new Body[3];/*** 记录三个小球的最新位置*/private Body[] bodys = new Body[3];
//计算新位置private void computePosition() {if (rate <= 1.0f) {bodys[0].centerX = (int) (originalBodys[0].centerX + movingDistance * 0.5f * rate);bodys[0].radius = (int) (originalBodys[0].radius + radiusRange * rate);bodys[1].centerX = (int) (originalBodys[1].centerX + movingDistance * 0.5f * rate);bodys[1].radius = (int) (originalBodys[1].radius + radiusRange * (1 - rate));bodys[2].centerX = (int) (originalBodys[2].centerX - movingDistance * rate);bodys[2].radius = originalBodys[2].radius;} else if (rate > 1.0f && rate <= 2.0f) {          bodys[0].centerX = (int) (originalBodys[0].centerX + movingDistance * 0.5f + movingDistance * 0.5f * (rate - 1));bodys[0].radius = (int) (originalBodys[0].radius + radiusRange * (2 - rate));bodys[1].centerX = (int) (originalBodys[1].centerX + movingDistance * 0.5f - movingDistance * (rate - 1));bodys[1].radius = originalBodys[1].radius;bodys[2].centerX = (int) (originalBodys[2].centerX - movingDistance + movingDistance * 0.5f * (rate - 1));bodys[2].radius = (int) (originalBodys[2].radius + radiusRange * (rate - 1));} else if (rate > 2.0f && rate <= 3.0f) {bodys[0].centerX = (int) (originalBodys[0].centerX + movingDistance - movingDistance * (rate - 2));bodys[0].radius = originalBodys[0].radius;bodys[1].centerX = (int) (originalBodys[1].centerX - movingDistance * 0.5f + movingDistance * 0.5f * (rate - 2)); rate));bodys[1].radius = (int) (originalBodys[1].radius + radiusRange * (rate - 2));bodys[2].centerX = (int) (originalBodys[2].centerX - movingDistance * 0.5f + movingDistance * 0.5f * (rate - 2));bodys[2].radius = (int) (originalBodys[2].radius + radiusRange - radiusRange * (rate - 2));}}
复制代码

3、确定绘制顺序

因为先绘制的图层会在下面,所以右->左这个运动位置的小球一定是最先绘制的

        if (rate <= 1.0f) {drawOrders[0] = 2;drawOrders[1] = 1;drawOrders[2] = 0;} else if (rate > 1.0f && rate <= 2.0f) {drawOrders[0] = 1;drawOrders[1] = 0;drawOrders[2] = 2;} else if (rate > 2.0f && rate <= 3.0f) {drawOrders[0] = 0;drawOrders[1] = 1;drawOrders[2] = 2;}
复制代码

4、动画开启和结束

@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();animStart();}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();animStop();}
复制代码

使用

xml

 <com.riverlet.loading.ThreeBodyLoadingViewandroid:layout_width="100dp"android:layout_height="100dp"android:layout_marginTop="50dp"app:firstColor="#FFFF0000"app:secondColor="#FF1C86EE"app:thirdColor="#FFEE9A00" />
复制代码
  • app:firstColor,球1颜色
  • app:secondColor,球2颜色
  • app:thirdColor,球3颜色

#代码 其他具体看代码吧:Loading

-----------------------------目录-----------------------------

  • 1、CircleLoadingView
  • 2、ThreeBodyLoadingView

Loading(二)--ThreeBodyLoadingView相关推荐

  1. vue生成自定义样式二维码

    使用vue-qr生成自定义二维码 vue-qr具有自定义二维码背景.logo.实点颜色等特性,能够生成更炫酷的二维码. 文章目录 使用vue-qr生成自定义二维码 效果图 安装 使用 部分参数说明 v ...

  2. Android 三种方式实现自定义圆形页面加载中效果的进度条

    转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如 ...

  3. vue笔记(四)注册组件,路由,vuex

    官网 一.项目中的组件注册 二.路由 三.vuex 一.项目中的组件注册 1. 全局 import Loading from '@/components/loading';//封装的loading组件 ...

  4. jQuery Step 向导插件参考文档

    文档来源:https://github.com/rstaib/jquery-steps/wiki 一.设置/setting [1]. 外观设置(Appearance) 设置名称 描述 值的类型 默认值 ...

  5. EFCore Lazy Loading + Inheritance = 干净的数据表 (二)

    前言 本篇是上一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (一) [献给处女座的DB First程序猿] 前菜 的续篇.这一篇才是真的为处女座的DB Fi ...

  6. 渡一教育公开课web前端开发JavaScript精英课学习笔记(二十一)CSS3实现Loading

    CSS3实现Loading <!DOCTYPE html> <html> <head><meta charset="UTF-8">& ...

  7. Android花样loading进度条(二)-简单环形进度条

    背景 Android花样loading进度条系列文章主要讲解如何自定义所需的进度条,包括水平.圆形.环形.圆弧形.不规则形状等. 本篇我们从圆形进度条讲起,讲简单形式的环形进度条,只有进度色彩,没有进 ...

  8. Displaying Bitmaps Efficiently (一)-----Loading Large Bitmaps Efficiently(二)

    在多媒体应用中,位图无处不在,但是如果加载到内存中的图片尺寸大于屏幕上要显示的图片尺寸时,这些高分辨率的图片便会引发许多性能问题.为了减轻应用的内存压力,必须要调整加载到内存中的位图大小. 需要想办法 ...

  9. CUDA运行时 Runtime(二)

    CUDA运行时 Runtime(二) 一. 概述 下面的代码示例是利用共享内存的矩阵乘法的实现.在这个实现中,每个线程块负责计算C的一个方子矩阵C sub,块内的每个线程负责计算Csub的一个元素.如 ...

最新文章

  1. 数字图像处理——第七章 小波和多分辨处理
  2. flyway java_flyway的使用
  3. 基于Office 365的随需应变业务应用平台
  4. Python发送邮件(Email SMTP)
  5. Bailian1182 POJ1182 食物链【并查集】
  6. Danfo.js专题 - 附:Dnotebook(Danfo Notebook)单机资源与汉化文档
  7. bp神经网络预测模型流程图,bp神经网络实例分析
  8. mac中不允许安装第三方软件
  9. x264代码剖析笔记
  10. 《信号与系统》解读 第1章 信号与系统概述-1:信号与系统的描述和分析方法
  11. 解决sublime text2字体显示模糊问题
  12. 面试中如何化解懵逼,从一个短网址服务说起
  13. 如何创建项目管理工作流程?
  14. 服务器能进系统滴滴响,主机报警连续响个不停
  15. 用linuxdeployqt打包程序遇到qmake找不到的问题如何解决
  16. 程序员接私活经验总结
  17. java自动化测试语言高级之MySQL 连接
  18. TAOCP作者的高德纳--------有神有关的故事
  19. JAVA将十位时间戳格式化为日期Date类型
  20. 【hive】数据倾斜-大表小表join优化mapjoin

热门文章

  1. 用VB实现循环队列算法收藏
  2. 秘鲁国家馆中国电商平台 美食周对话国际农民丰收节贸易会
  3. java-jpa-criteriaBuilder使用入门
  4. Mac androidStudio cannot resolve corresponding JNI function
  5. UI设计师必须了解:2015年十大移动端APP设计主流趋势
  6. 让服务器iis支持.apk文件下载的设置方法
  7. appcompat_v7 引起的新建Android工程编译不过的问题 (转载)
  8. ASP.NET MVC:@helper 不能调试
  9. nohup不输出日志信息的方法,及linux重定向学习
  10. PHP利用Curl、socket、file_get_contents POST数据