分析:这是一个组合控件加上属性动画来实现,布局是一个线性布局,一个变化的控件ShapeView,圆形,正方形,三角形不断变换,底部还有一个阴影,先下落动画和缩放,接着上抛和缩放动画并旋转,通过动画监听来控制旋转动画。效果如下图所示

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:orientation="vertical"android:background="#FFFFFF"android:gravity="center"android:layout_height="match_parent"><com.cmj.myview.view.ShapeViewandroid:id="@+id/shape_view"android:layout_width="25dp"android:layout_marginBottom="82dp"android:layout_height="25dp" /><Viewandroid:id="@+id/shadow_view"android:background="@drawable/loading_shadow_bg"android:layout_width="25dp"android:layout_height="3dp"/><TextViewandroid:layout_marginTop="5dp"android:layout_width="wrap_content"android:text="玩命记载中..."android:layout_height="wrap_content" /></LinearLayout>

阴影布局

<?xml version="1.0" encoding="utf-8"?>
<shapexmlns:android="http://schemas.android.com/apk/res/android"android:shape="oval"><solid android:color="#000000"/>
</shape>
/*** @author cmjsp1990@163.com* @date 2018/12/17* 先下落动画,同时缩放,接着上抛动画,同时旋转*/
public class ShapeView extends View {private Shape mCurrentShape = Shape.Circle;private Paint mPaint;private Path mPath;public ShapeView(Context context) {this(context, null);}public ShapeView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public ShapeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mPaint = new Paint();mPaint.setAntiAlias(true);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//只保证正方形int width = MeasureSpec.getSize(widthMeasureSpec);int height = MeasureSpec.getSize(heightMeasureSpec);setMeasuredDimension(Math.min(width, height), Math.min(width, height));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);switch (mCurrentShape) {case Circle://画圆形int center = getWidth() / 2;mPaint.setColor(ContextCompat.getColor(getContext(), R.color.circle));canvas.drawCircle(center,center,center,mPaint);break;case Square://画正方形mPaint.setColor(ContextCompat.getColor(getContext(),R.color.rect));canvas.drawRect(0,0,getWidth(),getHeight(),mPaint);break;case Triangle://三角mPaint.setColor(ContextCompat.getColor(getContext(),R.color.triangle));if (mPath==null){mPath = new Path();mPath.moveTo(getWidth() / 2, 0);mPath.lineTo(0, (float) ((getWidth()/2)*Math.sqrt(3)));mPath.lineTo(getWidth(), (float) ((getWidth()/2)*Math.sqrt(3)));// path.lineTo(getWidth()/2,0);mPath.close();// 把路径闭合}canvas.drawPath(mPath,mPaint);break;}}public Shape getCurrentShape() {return mCurrentShape;}/*** 改变形状*/public void exchange() {switch (mCurrentShape) {case Circle://画圆形mCurrentShape=Shape.Square;break;case Square:mCurrentShape=Shape.Triangle;break;case Triangle:mCurrentShape=Shape.Circle;break;}invalidate();}public enum Shape {Circle, Square, Triangle}
}
public class LoadingView extends LinearLayout {private final ShapeView mShapeView;private final View mShadowView;private int mTranslationDistance = 0;// 动画执行的时间private final long ANIMATOR_DURATION = 300;// 是否停止动画private boolean mIsStopAnimator = false;public LoadingView(Context context) {this(context, null);}public LoadingView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public LoadingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);inflate(context, R.layout.ui_loading_view, this);mShapeView = (ShapeView) findViewById(R.id.shape_view);mShadowView = findViewById(R.id.shadow_view);mTranslationDistance = dip2px(80);post(new Runnable() {@Overridepublic void run() {startFallAnimator();}});}/*** 开始下落动画*/private void startFallAnimator() {if (mIsStopAnimator){return;}//下落位移动画ObjectAnimator translationY = ObjectAnimator.ofFloat(mShapeView, "translationY", 0, mTranslationDistance);//配合中间阴影缩小ObjectAnimator scaleX = ObjectAnimator.ofFloat(mShapeView, "scaleX", 1f, 0.3f);//组合动画AnimatorSet animatorSet = new AnimatorSet();animatorSet.setDuration(ANIMATOR_DURATION);//加速差值器animatorSet.setInterpolator(new AccelerateInterpolator());animatorSet.playTogether(translationY, scaleX);animatorSet.start();animatorSet.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);//改变形状mShapeView.exchange();//下落结束后就进行上抛动画startUpAnimator();}});}/*** 开始上抛动画*/private void startUpAnimator() {if (mIsStopAnimator){return;}ObjectAnimator translationY = ObjectAnimator.ofFloat(mShapeView, "translationY", mTranslationDistance, 0);ObjectAnimator scaleX = ObjectAnimator.ofFloat(mShapeView, "scaleX", 0.3f, 1f);AnimatorSet animatorSet = new AnimatorSet();animatorSet.setDuration(ANIMATOR_DURATION);//减速差值器animatorSet.setInterpolator(new DecelerateInterpolator());animatorSet.playTogether(translationY, scaleX);animatorSet.start();animatorSet.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {//上抛结束就下落startFallAnimator();}@Overridepublic void onAnimationStart(Animator animation) {//开始旋转startRotateAnimator();}});}/*** 开始旋转动画*/private void startRotateAnimator() {ObjectAnimator rotationAnimator = null;switch (mShapeView.getCurrentShape()) {case Circle:case Square:rotationAnimator.ofFloat(mShapeView,"rotation",0,180);break;case Triangle:rotationAnimator.ofFloat(mShapeView,"rotation",0,-120);break;}rotationAnimator.setDuration(ANIMATOR_DURATION);rotationAnimator.setInterpolator(new DecelerateInterpolator());rotationAnimator.start();}@Overridepublic void setVisibility(int visibility) {super.setVisibility(View.INVISIBLE);//清理动画mShapeView.clearAnimation();mShadowView.clearAnimation();ViewGroup parent = (ViewGroup) getParent();if (parent!=null){parent.removeView(this);removeAllViews();}mIsStopAnimator=true;}private int dip2px(int dip) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, getResources().getDisplayMetrics());}
}

自定义控件之58同城加载相关推荐

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

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

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

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

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

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

  4. android 仿微信加载框,Android自定义控件——仿微信半透明加载框

    在我们的app中不免回遇到耗时操作,这时我们给个加载框进行过度,使用户体验大大加强. 一.CustomDialog类的编写 package com.daqsoft.jingguan.weight; i ...

  5. android 视频的缩略图 缓存机制和 异步加载缩略图

    在这次的工作开发项目中,涉及到一个视频缩略图的视频列表:这个在大家看来,制作视频缩略图就是两行代码就搞定的事.确实是这样的,百度一下,每个帖子都知道制作视频缩略图的方法,在这里确实也是一样的,但是我要 ...

  6. Android更新圆点代码,Android实现两圆点之间来回移动加载进度

    本文实例为大家分享了Android实现两圆点之间来回移动加载进度的具体代码,供大家参考,具体内容如下 一.前言 最近喜欢上自定义控件,喜欢实现一些简约有趣的控件,也好巩固下以前学得知识和不断的学习新知 ...

  7. Android进阶之路 - 实现58同城APP加载中页面

    此文引用的是58同城的加载动画,虽然出来有一些年头了,但我表示使用的时候因技术原因我还是遇到了一些或大或小的坑. 转载请注明:http://blog.csdn.net/qq_20451879/arti ...

  8. Android自定义波浪加载圆形进度条——(自定义控件 一)

    2019独角兽企业重金招聘Python工程师标准>>> 自定义控件-- 波浪形状圆形进度加载 时间管理的基础是精力管理,精力的高低.正负分影响到我们的效率 而时间是无法管理的,能够管 ...

  9. 自定义控件:广告内容后期加载。以及NamingContainer层次的应用

    <转>http://www.pin5i.com/showtopic-11037.html 网站上的广告内容可能会因加载过慢而导致整个网页加载过慢,我们可以考虑将广告内全部放在网页最底部,等 ...

最新文章

  1. Lesson 2 Installing the Oracle Database Software
  2. JavaScript prototype
  3. 【智能汽车与自动驾驶】
  4. 分段处理_连续油管无限级可开关固井滑套分段压裂工艺
  5. Linux文件属性3——文件权限管理
  6. python 参数个数 同名函数_Python——函数的参数
  7. k8s初始化集群后kubectl get nodes错误
  8. You may use special comments to disable some warnings. Use // eslint-disable-next-line……
  9. matlab pde工具箱解最优化控制,MATLAB PDE工具箱在半导体器件中的应用研究
  10. python wmi读取网卡MAC地址、CPU序列号、硬盘序列号、主板序列号、BIOS序列号
  11. 服务网与Kubernetes上的Istio分5步
  12. 时空、维度,以及其他(二)
  13. java中的Math类
  14. 机票预订系统的数据流程图及实体联系图
  15. linux xdg open 安装,xdg-open默认应用程序行为
  16. 裸女街上走秀一小时 路人疯狂拍照无人制止
  17. 华为鸿蒙会适配很老的机型吗,华为鸿蒙适配机型公布 P50首发/小米10S才是真正至尊版...
  18. 抖音SEO优化/系统搭建/源码
  19. python实现微信自动回复撩小姐姐
  20. 【C#】调用Bartender进行打印

热门文章

  1. 绘制一个具备基本功能的计算机模型原理图,数字信号处理仿真实验二
  2. 微信小程序表单数据提交到php处理,数据插入数据库小案例。
  3. MSP430C语言编程技巧,TIMSP430微控制器软件编程经验和应用技巧 - 全文
  4. 三维空间中的几何变换-平移旋转缩放
  5. linux v4l2 pdf,linux V4L2编程
  6. 通讯录管理系统(c语言版本)
  7. java计算机毕业设计旅游信息管理系统源代码+数据库+系统+lw文档
  8. openwrt DTS
  9. mac自带中文输入法提示条消失
  10. 河北欧格教育:店铺怎么装修