开源库 bouncyEditText解析

转载请注明出处:王亟亟的大牛之路

运行效果

如何使用?

在布局XML里引用即可,如下:

 <com.mingle.BouncyEditText
       android:layout_width="fill_parent"
       android:hint="账号"
       android:text="255"
       android:layout_height="wrap_content">
       </com.mingle.BouncyEditText>

跟别的自定义控件一样操作。

只需要在项目包里复制内贴BouncyEditText这个类和对应的一些资源文件即可,也可以Library相应的LIB包。

我们来读下核心类:

public class BouncyEditText extends EditText {

    private int hintColor=getResources().getColor(R.color.hint_color);
    private Paint paint;
    private Status status= Status.ANIMATION_NONE;
    private String hintText;
    private Interpolator animOutInterpolator;
    private Interpolator animInInterpolator;

    private float animInDuration=200.0f;
    private float animOutDuration=260.0f;

    private boolean isSetPadding=false;
    private boolean isHasHint = false;

    public BouncyEditText(Context context) {
        super(context);
    }

    public BouncyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public BouncyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        init();
    }

    private void init() {
        paint=new Paint();
        //初始化一些动画效果
        animOutInterpolator = new OvershootInterpolator(1.3f);
        animInInterpolator = new DecelerateInterpolator();

        if(getHint()!=null) {
            isHasHint =true;
            hintText = getHint().toString();
            setHint("");
        }
//        if (!TextUtils.isEmpty(getText().toString())) {
//            status = Status.ANIMATION_OUT;
//
//        } else {
//            status = Status.ANIMATION_IN;
//        }

    }
    //版本兼容
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public BouncyEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init();
    }

    long startTime;

    private String preString;
    //继承textview重写的方法
    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);
        if(!isHasHint){
            return;
        }

        if(TextUtils.isEmpty(preString) != TextUtils.isEmpty( getText().toString())) {

            if (!TextUtils.isEmpty(getText().toString())) {
                status = Status.ANIMATION_OUT;

            } else {
                status = Status.ANIMATION_IN;
            }

            preString = (String) getText().toString();
            startTime = System.currentTimeMillis();
        }
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text, type);

        if(TextUtils.isEmpty(text)){
            text="";
        }
        preString= (String) text;

    }

    public void setHintText(String hintText) {
        this.hintText = hintText;

        isHasHint =true;
        this.hintText = hintText;
        setHint("");

    }
        //具体的画一些效果啊,动作什么的,我们用就行了。
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        if(!isHasHint){
            return;
        }
        paint.set(getPaint());
        paint.setAntiAlias(true);
        paint.setColor(hintColor) ;

        if(!isSetPadding) {
            setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight() + (int) paint.measureText(hintText), getPaddingBottom());
            isSetPadding=true;
        }

        float maxHintY = getBaseline();
        switch (status){
            case  ANIMATION_IN:

                if(System.currentTimeMillis()-startTime<animInDuration
                        ){
                    float hintX=getCompoundPaddingLeft() + getScrollX()+(getWidth()-getCompoundPaddingRight()-getCompoundPaddingLeft())*(1- animInInterpolator.getInterpolation((System.currentTimeMillis()-startTime)/animInDuration));

                    canvas.drawText(hintText,hintX,maxHintY,paint);
                    postInvalidate();
                }else{
                    float hintX = getCompoundPaddingLeft();
                    canvas.drawText(hintText, hintX, maxHintY, paint);
                }

                break;
            case  ANIMATION_OUT:

                if(System.currentTimeMillis()-startTime<animOutDuration
                        ){
                    float hintX=getCompoundPaddingLeft() + getScrollX()+(getWidth()-getCompoundPaddingRight()-getCompoundPaddingLeft())* animOutInterpolator.getInterpolation((System.currentTimeMillis()-startTime)/animOutDuration);
                    canvas.drawText(hintText,hintX,maxHintY,paint);
                    postInvalidate();
                }else{
                    float hintX=
                            getScrollX()+(getWidth()-getCompoundPaddingRight());
                    canvas.drawText(hintText, hintX, maxHintY, paint);
                }

                break;
            case  ANIMATION_NONE:

                if(getText().toString().length()==0){
                    float hintX = getCompoundPaddingLeft() + getScrollX();
                    canvas.drawText(hintText,hintX,maxHintY,paint);

                }else{
                    float hintX=
                            getScrollX()+(getWidth()-getCompoundPaddingRight());
                    canvas.drawText(hintText,hintX,maxHintY,paint);
                }

                break;
        }

    }
    public enum  Status{
        ANIMATION_IN,
        ANIMATION_NONE,
        ANIMATION_OUT
    }
}

color.xml

<resources>

    <color name="hint_color">#9e9e9e</color>
</resources>

当然如果是伸手党,就更简单,复制上面的一堆,然后用就行了。很简单,效果也不错。

下载地址http://yunpan.cn/cQ74xshPWkExJ 访问密码 5597

时间: 2024-10-07 22:02:48

开源库 bouncyEditText解析的相关文章

【踩坑速记】全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻麻再也不用担心依赖第三方jar包繁琐无趣啦.而,如果自己写一个开源库是一种怎样的体验,此乃利(装)国(逼)利(神)民(器)呀! 而一路装逼不易,你会发现如果你要发布你的开源库到官方的Bintray/Jcenter并非易事,所以先去网上一探究竟,简单的,难的,五花八门,全(误)面(人)具(子)备(弟)

基于开源库jsoncpp的json字符串解析

json(JavaScript Object Notation)是一种轻量级高效数据交换格式.相比于XML,其更加简洁,解析更加方便.在实习期间,我负责的程序模块,多次使用到json进行数据传输.由于之前只对json稍稍了解,而且不熟悉项目组使用的开源json解析库,故在编码过程中效率很低,而且还出现过bug.虽然,最后项目组的事情比较顺利的完成了,但感觉自己对json的编解码熟悉仍然不够,故翻阅了相关文档,写下这篇技术博客.与君共勉. 1.什么是json JSON(JavaScript Obj

Android 网络开源库之-retrofit的解析详解

前言 当前的网络开源库有许多,如volley,okhttp,retrofit等,这三个库当前是比较火的,其中,okhttp和retrofit由square团队开发.关于这三个库的区别,请移步stackoverflow或者知乎查看.开发过程中选择什么样的开源库需要更具我们APP来做出选择.我们选出stackoverflow中的一段话来看下. 上面说,需要与web service通信的时候,我们使用retrofit.百度百科 web service介绍,那么我们见天就来了解下retrofit.

iOS开源库源码解析之AsnycDispalyKit

来自Leo的原创博客,转载请著名出处 我的stackoverflow 前言 最近心血来潮,想研究下FaceBook的AsnycDispalyKit的源代码,学习一些界面优化的技术以及编码风格.这篇文章,会详细的记录下我认为对新手有用的部分.后面有空的时候,继续研究其他几个iOS开发很流行的库-AFNetworking,SDWebImage,MBProgressHud,Mantle等`.AsnycDisplayKit是一个非常庞大的库,所以我尽量捞干的讲. 关于AsyncDisplayKit 文档

开源库Undobar简单使用解析

转载请注明出处:王亟亟的大牛之路 最近不忙在翻Git的时候发现这个自定义吐司(Toast)的开源库,就写这篇博文我分享给大家,话不多说线上截图(貌似很多截屏录像的APP都掏ROOT,测试机懒得弄,有知道其他方法的小伙伴帮忙推荐哈) 一些自定义的吐司和Animation,在不适用Dialog想用吐司省立的时候还是一个不错的选择哦! 包目录 一个Demo包,一个Lib包,Lib包里的东西其实不多,可以把它抠出来放在自己的项目目录里,就可读性稍微更高点. 举例分析: 这是其中一个效果的Activity

【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位...

[转]http://www.tuicool.com/articles/jyA3MrU Android开源库 自己一直很喜欢Android开发,就如博客签名一样, 我是程序猿,我为自己代言 . 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会 不定期的更新 这篇文章. Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以关注我的博客,每一个库都是我认真查看或者编译运行

C++开源库,欢迎补充

C++在“商业应用”方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年.因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应 用.当Java横行天下之后,MS又突然发力,搞出C#语言,有大片的曾经的C++程序员,以为C++要就此沉沦,未料,这三年来,C++的生命力突然被 严重地增强了.主力原因就是开源的软件.基础软件(比如并发原生支持,比如Android必定要推出原生的SDK).各种跨平台应用的出现. 开源C++库必须具有以下特点:必须是成熟的产品.跨平台的产品.相对通用的库

C++开源库大全(转)

程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架和库

iOS开发&gt;学无止境 - 异步图片加载优化与常用开源库分析

作者:罗轩(@luoyibu) 网址:http://www.jianshu.com/p/3b2c95e1404f 1. 网络图片显示大体步骤:   下载图片 图片处理(裁剪,边框等) 写入磁盘 从磁盘读取数据到内核缓冲区 从内核缓冲区复制到用户空间(内存级别拷贝) 解压缩为位图(耗cpu较高) 如果位图数据不是字节对齐的,CoreAnimation会copy一份位图数据并进行字节对齐 CoreAnimation渲染解压缩过的位图 以上4,5,6,7,8步是在UIImageView的setImag