以下来实现一个loading效果。详细效果例如以下:



首先对这个效果进行拆分,它由以下部分组成:

  • 1 一个”闪电”样式的图案。
  • 2 “闪电”图案背后是一个圆角矩形;
  • 3 “闪电”图案上面有一层颜色不断”飘过”

拆分完效果后。思考下如何实现。以下是我的思考过程。

  • 1 android sdk并没有提供这种控件,非常显然是须要自己定义控件。
  • 2 非常显然是一个View而不是ViewGroup。所以能够继承View;
  • 3 重点是onDraw的逻辑;
  • 4 如何绘制”闪电”的图案?能够通过Path绘制;
  • 5 如何绘制”闪电”背后的圆角矩形?canvas.drawRoundRect;
  • 6 如何实现”闪电”的动效?细致观察,发现上方那层颜色的运动规律是从0~闪电高度不断扩大。到达闪电高度的时候,高度不断减小直到0。所以能够通过控制高度的方式实现。

    仅仅要有两个变量scanTop/scanBottom记录绘制的上下界限就可以。然后控制scanTop/scanBottom进行变化就可以。如何控制变化非常显然能够通过post/postDelayed实现。

    另外一个难点是如何绘制部分”闪电”?思索一番,能够通过canvas.clipRect的方式控制绘制区域。这样间接实现了我们须要的效果;

  • 7 核心逻辑实现之后,须要考虑到应该让这个自己定义控件支持wrap_content.这必定须要重写onMeasure,并考虑到父容器的MeasureSpec(view的默认实现下wrap_content和match_parent效果一样)。
  • 8 须要让这个控件支持padding。所以得在measure和draw的过程中充分考虑到padding这个因素;
  • 9 当view被detach的时候,须要remove掉动画。
  • 10 应该提供几个默认大小,比方small/midium/large,这能够通过自己定义属性实现。

大致思考完之后。能够写代码了。

首先是measure过程:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec); //须要计算自己实际须要的宽高
//须要把padding考虑进来
//须要考虑父容器的測量规则 int width,height; width = (int)mViewMinWidth+getPaddingLeft()+getPaddingRight();
height = (int)mViewMinHeight+getPaddingTop()+getPaddingBottom(); setMeasuredDimension(getMeasuredSize(widthMeasureSpec, width), getMeasuredSize(heightMeasureSpec, height));
}

通过getMeasuredSize计算考虑父容器限制后的实际大小:

private int getMeasuredSize(int measureSpec,int desiredSize){

        int result;

        int mode = MeasureSpec.getMode(measureSpec);
int size = MeasureSpec.getSize(measureSpec); switch (mode){
case MeasureSpec.EXACTLY:
result = size;
break;
default:
result = desiredSize;
if(mode == MeasureSpec.AT_MOST)
result = Math.min(result,size);
break;
} return result; }

然后是draw的过程:


@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); mPaint.setColor(mViewBackground);
//假设xml中设置layout_width/layout_height大于默认宽高。那么居中(不同意小于默认宽高)
if(getWidth()-getPaddingLeft()-getPaddingRight() > (int)mViewMinWidth || getHeight()-getPaddingTop()-getPaddingBottom() > (int)mViewMinHeight){
canvas.translate((getWidth()-mViewMinWidth)/2.0f,(getHeight()-mViewMinHeight)/2.0f);
}
//画圆角矩形
canvas.drawRoundRect(mBounds, dp2px(5), dp2px(5), mPaint);
//平移到圆角矩形中心点,画闪电
canvas.translate((mViewMinWidth - mDefaultWidth) / 2.0f, (mViewMinHeight - mDefaultHeight) / 2.0f);
mPaint.setColor(mBackgroundColor); canvas.drawPath(mThunderPath, mPaint);
mPaint.setColor(mCoverColor);
//通过clicpRect的方式控制可绘制区域(在外界看来好像有闪动的动画效果)
canvas.clipRect(getPaddingLeft(), mScanTop + getPaddingTop(), mDefaultWidth + getPaddingLeft(), mScanBottom + getPaddingTop());
canvas.drawPath(mThunderPath, mPaint);
}

mScanTop/mScanBottom变量能够通过post()进行改变:

class AnimRunnable implements Runnable{
@Override
public void run() {
if (!flag) {
mScanBottom += mGap;
if (mScanBottom >= mDefaultHeight) {
mScanBottom = (int) mDefaultHeight;
flag = true;
}
postInvalidate();
post(this);
} else {
mScanTop += mGap;
if (mScanTop >= mDefaultHeight) {
mScanTop = mScanBottom = 0;
flag = false;
postInvalidate();
postDelayed(this, 700);
} else {
postInvalidate();
post(this);
}
}
}
}
private void startAnim() {
mRunnable = new AnimRunnable();
post(mRunnable);
}

核心代码就这么多。

完整代码在这里:https://github.com/Rowandjj/ThunderLoadingView

仿易讯clientloading效果的更多相关文章

  1. 完美拖拽 &&仿腾讯微博效果&& 自定义多级右键菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Js仿腾讯微博效果

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. JS实现仿腾讯微博无刷新删除微博效果代码

    这里演示JS仿腾讯微博无刷新删除效果,将显示在微博列表里的内容删除,运用AJAX技术,无刷新删除微博的内容,参考性强,希望对初学AJAX的朋友有所帮助. 在线演示地址如下: http://demo.j ...

  4. JS 仿腾讯发表微博的效果

    JS 仿腾讯发表微博的效果 最近2天研究了下 腾讯发表微博的效果 特此来分享下,效果如下: 在此分享前 来谈谈本人编写代码的习惯,很多人会问我既然用的是jquery框架 为什么写的组件不用Jquery ...

  5. 仿腾讯QQ竖直滑动导航菜单

    菜单就像qq软件的分组,鼠标经过自动显示相应组的内容. 效果体验网址:http://keleyi.com/a/bjad/nf86w2dv.htm 以下是源代码: <html> <he ...

  6. 【Android UI设计与开发】7.底部菜单栏(四)PopupWindow 实现显示仿腾讯新闻底部弹出菜单

    前一篇文章中有用到 PopupWindow 来实现弹窗的功能.简单介绍以下吧. 官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图.出现的弹出窗口是一个浮动容器的当前活动. 1.首先来 ...

  7. Android 高仿腾讯旗下app的 皮肤加载技术

    http://www.cnblogs.com/punkisnotdead/p/4968851.html 以前写的这篇文章 可以高仿出 知乎 新浪微博等 绝大多数app的换肤技术,但是遗漏了腾讯的效果, ...

  8. 仿腾讯微博的一个弹出框 v0.1 beta

    仿腾讯微博的一个弹出框 v0.1 beta   代码写的不太好,新手请大家海涵,只为博君一笑,勿放在心上. 写在这里留作纪念,也许以后用的到. 效果 CSS .prompt{ position: ab ...

  9. Jquery实现仿腾讯微薄的广播发表

    前言: 由于这几天在学习Jquery的一些知识,比以前的感觉就是Jquery太强大了,很多很简单的功能以前在JavaScript要写几十行的代码而在Jquery中只用几行代码就搞定了,所以我决定好好学 ...

随机推荐

  1. 关于URL编码 [转]

    转自: http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 作者: 阮一峰 日期: 2010年2月11日 一.问题的由来 URL就是网址, ...

  2. XPath语法 在C#中使用XPath例子与用法

    XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识.示例Xml: <?xml version="1.0" enc ...

  3. java 仓库maven

    工具: apache-maven-3.2.3.zip maven_data.zip 在java Window->Preferences->Maven中 Installations中添加ap ...

  4. Java IO 学习(一)同步/异步/阻塞/非阻塞

    关于IO,同步/异步/阻塞/非阻塞,这几个关键词是经常听到的,譬如: “Java oio是阻塞的,nio是非阻塞的” “NodeJS的IO是异步的” 但是这些东西听多了就容易迷糊,比方说同步是否就是阻 ...

  5. Akka 和 μJavaActors入门

         Akka和μJavaActorsμJavaActors均是java的Actor库,其中Akka提供了叫为完整的Actor开发框架,较为庞大,学习成本很高,μJavaActors 是一个轻量级 ...

  6. 我眼中的AI

    !!!!本文禁止转载,引用,仅供观看 最初了解人工智能是在我上大二的时候,在看头条的时候经常看到有关人工智能的事情,当时的我和大多数的人一样,感觉人工智能很神奇.当时就整晚整晚的想人工智能会取代人类呀 ...

  7. Linux文件名命名规范

    注意:在Linux下全部文件和文件夹命名都是小写的! Linux系统区分英文字符的大小写.命名目录和命名文件的规则是相同的.除非有特别的原因,否则用户创建的文件和目录名要使用小写字符.大多数的Linu ...

  8. 最长递增子序列问题—LIS

    问题:给定一组数 a0,a0,....,an-1. 求该序列的最长递增(递减)序列的长度. 最长递增子序列长度的求法有O(n^2)和O(nlogn)两种算法. 1.复杂度为O(n^2)的算法. 设L[ ...

  9. C#里判断字符串是否为纯数字

    c bool IsNumeric(string str) //接收一个string类型的参数,保存到str里 { if (str == null || str.Length == 0) //验证这个参 ...

  10. IntelliJ IDEA 识别一个类所属的jar包package

    IntelliJ IDEA 识别一个类所属的jar包package 按住ctrl,鼠标移动上去,不要点击: 有木有快捷键? ctrl+alt+B直接就过去了:需要再跳回来: