仿易讯clientloading效果
以下来实现一个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);
    }
核心代码就这么多。
仿易讯clientloading效果的更多相关文章
- 完美拖拽 &&仿腾讯微博效果&& 自定义多级右键菜单
		
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - Js仿腾讯微博效果
		
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
 - JS实现仿腾讯微博无刷新删除微博效果代码
		
这里演示JS仿腾讯微博无刷新删除效果,将显示在微博列表里的内容删除,运用AJAX技术,无刷新删除微博的内容,参考性强,希望对初学AJAX的朋友有所帮助. 在线演示地址如下: http://demo.j ...
 - JS 仿腾讯发表微博的效果
		
JS 仿腾讯发表微博的效果 最近2天研究了下 腾讯发表微博的效果 特此来分享下,效果如下: 在此分享前 来谈谈本人编写代码的习惯,很多人会问我既然用的是jquery框架 为什么写的组件不用Jquery ...
 - 仿腾讯QQ竖直滑动导航菜单
		
菜单就像qq软件的分组,鼠标经过自动显示相应组的内容. 效果体验网址:http://keleyi.com/a/bjad/nf86w2dv.htm 以下是源代码: <html> <he ...
 - 【Android UI设计与开发】7.底部菜单栏(四)PopupWindow 实现显示仿腾讯新闻底部弹出菜单
		
前一篇文章中有用到 PopupWindow 来实现弹窗的功能.简单介绍以下吧. 官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图.出现的弹出窗口是一个浮动容器的当前活动. 1.首先来 ...
 - Android 高仿腾讯旗下app的 皮肤加载技术
		
http://www.cnblogs.com/punkisnotdead/p/4968851.html 以前写的这篇文章 可以高仿出 知乎 新浪微博等 绝大多数app的换肤技术,但是遗漏了腾讯的效果, ...
 - 仿腾讯微博的一个弹出框 v0.1 beta
		
仿腾讯微博的一个弹出框 v0.1 beta 代码写的不太好,新手请大家海涵,只为博君一笑,勿放在心上. 写在这里留作纪念,也许以后用的到. 效果 CSS .prompt{ position: ab ...
 - Jquery实现仿腾讯微薄的广播发表
		
前言: 由于这几天在学习Jquery的一些知识,比以前的感觉就是Jquery太强大了,很多很简单的功能以前在JavaScript要写几十行的代码而在Jquery中只用几行代码就搞定了,所以我决定好好学 ...
 
随机推荐
- Logger用法
			
logger的输出有两种方式:①log.log(Level.INFO,"message")②log.info("mesage")其他级别的输出与此类似. 获得c ...
 - centos 7 安装git并配置ssh
			
一.安装 1.查看是否安装git rpm -qa|grep git 有git加版本号就说明已经安装过了 2.安装git yum install git 3.查看git版本 git version 二. ...
 - Loj #6164. 「美团 CodeM 初赛 Round A」数列互质
			
link : https://loj.ac/problem/6164 莫队傻题,直接容斥做. #include<bits/stdc++.h> #define maxn 100005 #de ...
 - centos中httpd Server not started: (13)Permission denied: make_sock: could not bind to address [::]:8888
			
Install semanage tools: sudo yum -y install policycoreutils-python Allow port 88 for httpd: sudo sem ...
 - 【svn】idea上svn 忽略文件不提交
			
可以自己新建一个更改文件列表,名字叫忽略 这样 你就可以 单纯的 管理剩余的默认文件了 ======================================================== ...
 - Android - 显示手机执行的Activity
			
显示手机执行的Activity 本文地址:http://blog.csdn.net/caroline_wendy 手机中,须要调试程序的界面,能够高速进行定位,使用Android开发工具ADB(And ...
 - 服务器性能之CPU
			
有时我们会发现开发的应用在CPU核数一样的虚拟服务器上性能表现出较大的差异,这是为什么呢?上次有童鞋问到我这样一个问题,所以我根据自己的理解给大家简说下! CPU生产商为了提高CPU的性能,通常做法是 ...
 - 使用REST-Assured对API接口进行自动化测试
			
转载:http://blog.csdn.net/u012050416/article/details/50674612 准备 目标 开始编码 总结 说明:本文只是一个getStart示例,关键在于 ...
 - 上传项目至svn服务器,从svn上获取项目
			
1.在桌面右键->TortoiseSVn->Repo_brower->输入地址,进入 ,ok 2.在地址目录上右键==>>add folder==>>选择你要 ...
 - ListView嵌套两个EditText相关显示问题
			
这里说明:本人第一次写博客,可能写的不算太好.可是这个相关类型的研究与拓展,是项目中比較难得的.所以开一篇博客来总结和思考.先让我们看看项目需求. 项目需求说明: 1.须要在点击EditText的时候 ...