今天打开58同城App看到他们的网络加载Loading做的很有新意,是一个三角形,圆形,正方形不同的运动并且切换,这个效果不说有多难,至少很有创意,就着手模仿了一下,先看下效果图:

58的更加复杂,在形状运动的过程还一直不停的旋转,旋转的坐标计算太复杂, 还没有搞定,先把这个半成品开源出来。

思路:1.先画一个静态的形状和下面的阴影。  2.通过ValueAnimator不停的改变纵坐标,在动画的监听中拿到 当前的坐标值,重新invalidate()此时的View。3.在向下的动画执行完毕后,更新Shape。然后让动画不停的运动即可。
package view;
/*** @description 仿58加载View* @author rzq* @date 2015年10月10日*/
public class MyLoadingView extends View
{/*** 公共变量*/private Context mContext;private Resources mResource;private Paint mPaint;private Paint mOvalPaint;/***/private int mRadius;private int mDistance;private int mOvalTop;private int mOvalHeight;private int mOvalWidth;/*** 所有形状的中心位置*/private int mCenterX, mCenterY;private int currentCenterY;private Animator mRotationAnim;private ValueAnimator mLineAnimDown;private ValueAnimator mLineAnimUp;private Shape shape;public MyLoadingView(Context context){this(context, null);}public MyLoadingView(Context context, AttributeSet attrs){super(context);this.mContext = context;this.mResource = context.getResources();init();}private void init(){mRadius = 10;mDistance = 50;mOvalHeight = 3;mOvalWidth = 10;mOvalTop = 25;mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setStyle(Style.FILL);mPaint.setColor(mResource.getColor(R.color.rect));mOvalPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mOvalPaint.setStyle(Style.FILL);mOvalPaint.setColor(mResource.getColor(R.color.color_666666));setupAnimations();shape = Shape.RECT;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){/*** 宽度最长是矩形的宽,高度最高是矩形的高加上distance*/int width = (mRadius * 2);int height = (mDistance + mRadius * 2 + mOvalTop + mOvalHeight);setMeasuredDimension(width, height);currentCenterY = mCenterX = mCenterY = mRadius;}@Overrideprotected void onDraw(Canvas canvas){switch (shape){case RECT:drawRect(canvas);break;case TRAIL:drawTrail(canvas);break;case CIRCLE:drawCircle(canvas);break;}drawOval(canvas);}/*** 更具中心点的改变,绘制矩形*/private void drawRect(Canvas canvas){canvas.drawRect(mCenterX - mRadius, currentCenterY - mRadius, mCenterX + mRadius, currentCenterY + mRadius,mPaint);}private void drawTrail(Canvas canvas){Path path = new Path();int leftX = 0;int leftY = currentCenterY + mRadius;int middleX = mCenterX;int middleY = currentCenterY - mRadius;int rightX = mCenterX + mRadius;int rightY = currentCenterY + mRadius;path.moveTo(leftX, leftY);path.lineTo(middleX, middleY);path.lineTo(rightX, rightY);path.close();canvas.drawPath(path, mPaint);}private void drawCircle(Canvas canvas){canvas.drawCircle(mCenterX, currentCenterY, mRadius, mPaint);}private void drawOval(Canvas canvas){float factory = ((mDistance + mRadius) - currentCenterY) / (float) mDistance;RectF rectF = new RectF(mCenterX - mOvalWidth * factory, mDistance + mRadius * 2 + mOvalTop, mCenterX+ mOvalWidth * factory, mDistance + mRadius * 2 + mOvalTop + mOvalHeight);canvas.drawOval(rectF, mOvalPaint);}private void setupAnimations(){mRotationAnim = ValueAnimator.ofInt(0, 180);mLineAnimDown = ValueAnimator.ofInt(mCenterY + mRadius, mDistance);mLineAnimDown.setInterpolator(new AccelerateInterpolator(1.2f));mLineAnimDown.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator){currentCenterY = (Integer) valueAnimator.getAnimatedValue();invalidate();}});mLineAnimUp = ValueAnimator.ofInt(mDistance, mCenterY + mRadius);mLineAnimUp.setInterpolator(new DecelerateInterpolator(1.2f));mLineAnimUp.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator){currentCenterY = (Integer) valueAnimator.getAnimatedValue();invalidate();}});mLineAnimDown.addListener(new AnimatorListenerAdapter(){@Overridepublic void onAnimationEnd(Animator animation){if (shape == Shape.RECT){mPaint.setColor(mResource.getColor(R.color.triangle));shape = Shape.TRAIL;}else{if (shape == Shape.TRAIL){mPaint.setColor(mResource.getColor(R.color.circle));shape = Shape.CIRCLE;}else{mPaint.setColor(mResource.getColor(R.color.rect));shape = Shape.RECT;}}}});final AnimatorSet set = new AnimatorSet();set.addListener(new AnimatorListener(){@Overridepublic void onAnimationStart(Animator animation){}@Overridepublic void onAnimationRepeat(Animator animation){}@Overridepublic void onAnimationEnd(Animator animation){set.start();}@Overridepublic void onAnimationCancel(Animator animation){}});set.playSequentially(mLineAnimDown, mLineAnimUp);set.setDuration(300);set.setStartDelay(100);set.start();}private enum Shape{RECT, TRAIL, CIRCLE;}
}用法:直接在布局中引入即可。<RelativeLayout      xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/white" ><view.MyLoadingViewandroid:id="@+id/loadView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true" />
</RelativeLayout>

之前看到一个开源View整个动画都是用ViewAnimator衔接起来的,感觉这种方式非常的好,我也尝试的用这种方式实现。

扩张:自定义 View中我为方便将一些属性等的都直接指定了,更好的方式是以自定义属性的方式使用更好。![欢迎大家关注我的微信公众号,每天会为大家推荐一篇好的技术文章,还有我的视频课程喔](https://img-blog.csdn.net/20160927222837538)

Android仿58同城Loading View相关推荐

  1. android 仿 动画,Android动画 - 仿58同城加载动画

    Android动画 - 仿58同城加载动画 效果图 58LoadingView.gif 分析动画 首先分析动画,如上图所示: 动画分为三部分,分别为上方跳动部分,中间阴影部分,和下方文字部分. 上方跳 ...

  2. 仿58同城的伪静态写法

    IIS下的伪静态,想仿58同城的二手房频道做伪静态,碰到的疑问? 例:当用户只按房源价格索时,可以这样写: RewriteRule /esf/price(\d+)/ /esf\.asp?price=$ ...

  3. 仿58同城地方门户本地生活小程序源码

    仿58同城地方门户本地生活小程序源码 PHP仿58同城小程序 微信分类信息平台 地方门户本地生活 完整源码带后台,后台基于微擎(非Thinkphp)开发,不懂微擎的请不要下载,内涵详细安装教程文档 同 ...

  4. 仿58同城本地生活服务平台系统源码 完整代码包+搭建教程

    今天分享一个仿58同城本地生活服务平台系统源码,含完整的数据代码包和详细的搭建教程,主要的核心功能有:电商商城.新闻资讯.外卖配送.服务预约.招聘求职.社区论坛等等. 本地微同城生活服务源码系统,把全 ...

  5. 学习自定义View(二)仿58同城加载

    之前用58同城app的时候看到它的加载界面不错,但是那时候还不知道如何实现~接触自定义View后,于是自己试着模仿写了一个 先看效果图: 录制的GIF上有一点卡,其实在真机上面运行很流畅的~ 其实感觉 ...

  6. readfile读取串口数据_谈一谈使用字体库加密数据仿58同城

    本文转载于 SegmentFault 社区 作者:Aaron 对于前端同学来说其实做的更多的事情就是把数据整合好,按照UI同学的设计通过后端同学给的数据展示在网页中,这也就导致了很多人认为前端很简单, ...

  7. android组件什么时候加载到r文件,Android自定义加载loading view动画组件

    我写写使用步骤 自定义view(CircleProgress )的代码 package com.hysmarthotel.view; import com.hysmarthotel.roomcontr ...

  8. 红橙Darren视频笔记 动画讲解 仿58同城 加载动画

    参考链接 https://www.jianshu.com/p/e4de28b4d8ac 效果 一.动画分类介绍 帧动画 和 补间动画 帧动画:一张一张的图片不断轮巡播放 补间动画:位移,透明度,像缩放 ...

  9. android 仿支付宝动画,自定义view之仿支付宝动画

    在学习本篇之前,你首先需要了解如下知识点: 自定义属性 实现效果图: 支付宝动画.gif 实现步骤: 绘制圆形 绘制对号的左边部分 绘制对号右边的部分 是不是感觉说了和没说一样,但思路就是这样 我们先 ...

  10. 仿58上市公司(PC站+手机站)网站源码

    该源码是仿58上市公司(PC站+手机站)网站源码,2014最新仿58同城上市公司源http://码 多城市分类信息源码带wap,安装文件:.访问 /install.php进行安装,出现数据库连接失败的 ...

最新文章

  1. Windows内核新手上路2——挂钩shadow SSDT
  2. rabbitmqctl status报错
  3. fir.im Weekly - 2017 年必须了解的 iOS 开源库
  4. java 数组去重_java面试题:数组去重
  5. (转)Django ==== 实战学习篇九 在session中保存购物车
  6. html中实现回车或点击进入-----Mr.Zhang
  7. Visual Studio Code for DBA的介绍
  8. 什么是UML?分哪两类?
  9. 台大李宏毅Machine Learning 2017Fall学习笔记 (14)Unsupervised Learning:Linear Dimension Reduction
  10. mysql5.7.9 zip achive
  11. MODIS数据下载——CSV模式直接下载hdf文件
  12. NC14548-B-逃脱(bfs)
  13. cf85d treap
  14. 基于MIMO的滤波器组多载波调制技术(后期将附上MATLAB代码)
  15. AnyConnect Windows系统的使用教程
  16. halocn标定找旋转中心_HALOCN运算功能函数快查 | 学步园
  17. 【ceph】分布式存储ceph
  18. 网店美工之你不知道的图片设计技巧
  19. 大学三年如何使用计算机论文,大学计算机导论论文3000字.docx
  20. 第一章 ArcMap、ArcCatalog、 ArcToolbox基础入门操作

热门文章

  1. CentOS7与CentOS6区别及特点
  2. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。
  3. leetcode之回文链表
  4. [luogu1081] 开车旅行
  5. CentOS_mini下安装docker 之 安装docker CE
  6. WebAPI Delete方法报错405 Method Not Allowed
  7. [NOIP2013] 华容道
  8. MVC5+EF6--1 创建Entity Framework数据模型
  9. Box2DWeb_04之碰撞检测
  10. MFC 创建快捷方式(学习笔记)