Android仿搜狗浏览器加载动画

周六,国庆放假调休,今天闲来无事,就看了下搜狗浏览器的加载动画。感觉结合前面学习的基础还是能做出来的,所以就简单的实现了下,然后写下这边博客给大家参考参考,权当巩固基础。

我们先来看看搜狗的效果图,效果图是通过豌豆荚的屏幕截取的,由于公司电脑配置太差,用的Android Sutido导致卡的一笔。所以效果大家见谅了。有兴趣的可以下载个搜狗浏览器看看。

参照效果图,无非就是简单的绘制一个圆然后搞点动画,所以结合前面博客的基础,是基本能做出来的,如果对动画还不是很熟悉的朋友,可以参照我的这篇博客来了解下。Android基础之Android动画。

下面看看我们的效果图:

还是比较像的,这里就提供个思路,具体的大家可以参照代码进行修改。下面简要说下里面涉及到的几个技术点。

技术点一:弹跳动画

这里我们使用的ValueAnimator进行动画的实现,不熟悉的同学,可以参照上面的博客。先来看看这部分的代码:

 @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//获取视图的中心点startX = getWidth()/2;endY =  getHeight() / 2;startY= endY * 5 / 6;mPaint.setColor(color);if(currentY == 0){playAnimator();}else{drawCircle(canvas);drawShader(canvas);}}//动画执行private void playAnimator(){//我们只需要取Y轴方向上的变化即可ValueAnimator valueAnimator = ValueAnimator.ofInt(startY,endY);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {currentY = (Integer)animation.getAnimatedValue();invalidate();}});valueAnimator.setInterpolator(new AccelerateInterpolator(1.2f));valueAnimator.setRepeatCount(-1);valueAnimator.setRepeatMode(2);valueAnimator.setDuration(500);valueAnimator.start();}

为了掩饰效果,我们将View放置在视图中心,我们首先根据当前点是否为0进行判断,然后如果为0,我们执行属性动画。属性动画,我们只需要对Y轴变量进行变动处理即可,x轴无需关心,然后通过:

 currentY = (Integer)animation.getAnimatedValue();invalidate();

进行刷新每次的视图,所以就开始绘制圆形了。同时为了处理到达底部有个压扁的效果,我用了绘制椭圆来处理。

 /*** 绘制圆形* @param canvas*/private void drawCircle(Canvas canvas){//当接触到底部时候,我们为了要描绘一种压扁的效果if(endY - currentY >10){canvas.drawCircle(startX,currentY,radius * density,mPaint);}else{rectF = new RectF(startX - radius * density - 2,currentY - radius * density+5,startX + radius * density+2,currentY + radius * density);canvas.drawOval(rectF,mPaint);Log.d(TAG,"Oval");}}

技术点二:影子的处理

我们通过效果图发现,当球离的比较近的时候,会出现黑压压的影子,这里,我们采用的是绘制一个椭圆的效果来实现,按照常理,影子的大小也会随着高度的变化而变化,这里我是通过判断当前高度和总高度差的比率来计算,然后确定椭圆的范围进行绘制,这样就能达到椭圆的动态伸缩效果。

 /*** 绘制阴影部分,由椭圆来支持,根据高度比来底部阴影的大小*/private void drawShader(Canvas canvas){//计算差值高度int dx = endY - startY;//计算当前点的高度差值int dx1 = currentY - startY;float ratio = (float) (dx1 *1.0 / dx);if(ratio <= 0.3){//当高度比例小于0.3,所在比较高的时候就不进行绘制影子return;}int ovalRadius = (int) (radius * ratio * density);//设置倒影的颜色mPaint.setColor(Color.parseColor("#3F3B2D"));//绘制椭圆rectF = new RectF(startX-ovalRadius,endY+10,startX+ovalRadius,endY+15);canvas.drawOval(rectF,mPaint);}

这样就完成了全部的代码,是不是很简单,只要会点动画基础就能做出来了。

下面附上全部代码:

    /*** Created by shiwei.deng on 2015/10/10.*/public class SoGouBrowserLoading extends View{private final String TAG = "QQBrowserLoading";//画笔private Paint mPaint;//颜色private int color = Color.parseColor("#0000FF");//半径private int radius = 10;private float density;private RectF rectF;//起点、终点、当前点private int startY,startX,endY,currentY;public SoGouBrowserLoading(Context context, AttributeSet attrs) {super(context, attrs);density = getResources().getDisplayMetrics().density;mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setStyle(Paint.Style.FILL);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//获取视图的中心点startX = getWidth()/2;endY =  getHeight() / 2;startY= endY * 5 / 6;mPaint.setColor(color);if(currentY == 0){playAnimator();}else{drawCircle(canvas);drawShader(canvas);}}//动画执行private void playAnimator(){//我们只需要取Y轴方向上的变化即可ValueAnimator valueAnimator = ValueAnimator.ofInt(startY,endY);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {currentY = (Integer)animation.getAnimatedValue();invalidate();}});valueAnimator.setInterpolator(new AccelerateInterpolator(1.2f));valueAnimator.setRepeatCount(-1);valueAnimator.setRepeatMode(2);valueAnimator.setDuration(500);valueAnimator.start();}/*** 绘制圆形* @param canvas*/private void drawCircle(Canvas canvas){//当接触到底部时候,我们为了要描绘一种压扁的效果if(endY - currentY >10){canvas.drawCircle(startX,currentY,radius * density,mPaint);}else{rectF = new RectF(startX - radius * density - 2,currentY - radius * density+5,startX + radius * density+2,currentY + radius * density);canvas.drawOval(rectF,mPaint);Log.d(TAG,"Oval");}}/*** 绘制阴影部分,由椭圆来支持,根据高度比来底部阴影的大小*/private void drawShader(Canvas canvas){//计算差值高度int dx = endY - startY;//计算当前点的高度差值int dx1 = currentY - startY;float ratio = (float) (dx1 *1.0 / dx);if(ratio <= 0.3){//当高度比例小于0.3,所在比较高的时候就不进行绘制影子return;}int ovalRadius = (int) (radius * ratio * density);//设置倒影的颜色mPaint.setColor(Color.parseColor("#3F3B2D"));//绘制椭圆rectF = new RectF(startX-ovalRadius,endY+10,startX+ovalRadius,endY+15);canvas.drawOval(rectF,mPaint);}/*** 设置颜色* @param color*/public void setColor(int color) {this.color = color;}}

至此,全部的开发工作已经完成,基本功能已经实现,客官,你看懂了没有?

源码下载

github地址
作者:mr_dsw 欢迎转载,与人分享是进步的源泉!

转载请保留地址:http://blog.csdn.net/mr_dsw

Android仿搜狗浏览器加载动画相关推荐

  1. android 今日头条加载动画,高仿今日头条加载动画

    01 每每浏览手机app时,发现有的效果体验不错,作为一位程序员,总想要是自己来做,怎么实现. 今天我们来模仿今日头条的加载动画. 首先我们来看一下我们这个demo最终效果,有图有真相. 高仿今日头条 ...

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

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

  3. Android仿抖音加载框之两颗小球转动控件

    Android仿抖音加载框之两颗小球转动控件 本篇文章已授权微信公众号 hongyangAndroid(鸿洋)独家发布. 效果图 安卓版抖音v2.5加载框: 本控件效果图: 使用方法 源码地址:And ...

  4. android自定义笑脸,Android实现笑脸进度加载动画

    最近看到豆瓣的笑脸loading很有意思,看一张效果图: 下面分析一下如何实现这样的效果: 1.默认状态是一张笑脸的状态(一个嘴巴,两个眼睛,默认状态) 2.开始旋转,嘴巴追上眼睛(合并状态) 3.追 ...

  5. Android 抖音爱心动画,Android动画 - 仿抖音加载动画

    在地铁中刷抖音,由于网络不通畅加载很慢,抖音会加载一个加载动画,感觉很有意思,于是分析了一下,自己写了Demo,实现效果. 效果图 分析动画 首先分析动画,初始状态是由两个相切的圆形图案组成. 将动画 ...

  6. 仿抖音加载动画(两个小球转动)效果

    经常玩抖音的小伙伴肯定熟悉抖音的加载效果,但是如何实现的呢?先上效果图: 是不是感觉很不错呢?接下来直接上代码: 1.先创建一个attr.xml文件夹用来自定义属性: <?xml version ...

  7. android酷炫转圈动画,android常用旋转线条加载动画

    想要知道关于更多自定义View的实例,请参考:android自定义View索引 先上个效果图,以免大家跑错地了. 嗯,整个来说呢,除了舍不得充VIP去掉水印之外,其他都挺好的. 下面开始实现我们的效果 ...

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

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

  9. android应用的loading加载动画制作

    加载界面只需要一张logo,颜色渐深,三秒显示后跳入下一个activity,同时去掉标题栏与状态栏.代码如下:AppLoadingActivity.java中 public class AppLoad ...

最新文章

  1. 在Debian中建立Beaglebone black的应用开发环境之四:如何布置应用?
  2. python遍历目录树_在Python中遍历目录树的速度要快得多?
  3. .NET Core 在程序集中集成Razor视图
  4. 云+X案例展 | 传播类:九州云 SD-WAN 携手上海电信,助力政企客户网络重构 换新颜
  5. JavaScript-jQuery事件
  6. 遍历children_589. N叉树的前序遍历
  7. Java语言基础(2)
  8. linux操作系统常用命令
  9. wpsppt流程图联系效果_wps幻灯片怎么制作流程图
  10. c语言画实心坐标点,c-绘制实心圆的快速算法?
  11. 【性能工具】Windows性能监控工具Perfmon使用指南
  12. 【Scala】Scala中的模式匹配、类型参数与隐式转换
  13. marker 头像 高德地图_高德地图头像怎么更换 高德地图更换头像图文教程
  14. Android手机直播
  15. Matlab函数、子函数的定义方法
  16. HTML5捕鱼php,html5捕鱼达人 游戏源码
  17. python代做在哪找靠谱_现在知道莆田鞋在哪买靠谱普及_莆田鞋在哪买靠谱
  18. 2021AIOps挑战赛|基于移动通信网络运维中的多指标时空序列预测
  19. 软件生命周期、管理软件过程-------------【软件】
  20. 自研P2P镜像分发系统

热门文章

  1. 2022年8月及1-8月国内动力电池企业装车量排名:“宁王”第一,“迪王”猛追
  2. Python骚操作—自动刷抖音
  3. 电脑开机停在主板logo画面
  4. [知识点滴]HTML5元素垂直居中那些事?
  5. 【没有刀剑,如何行走江湖】半晌私语(下)
  6. NEFU 大一寒假训练六(二分查找)题目预测
  7. Word文档或PDF转图片
  8. Mac切换docker镜像源
  9. android 图片气泡,关于实现微信聊天气泡里显示图片解决方案
  10. 【数据结构】最小生成树(Prim算法,普里姆算法,普利姆)、最短路径(Dijkstra算法,迪杰斯特拉算法,单源最短路径)