开源库 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-08-29 03:16:23

开源库 bouncyEditText解析的相关文章

Java中使用开源库JSoup解析HTML文件实例_java

HTML是WEB的核心,互联网中你看到的所有页面都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技术动态生成的.你的浏览器会去解析HTML并替你去渲染它们.不过如果你需要自己在Java程序中解析HTML文档并查找某些元素,标签,属性或者检查某个特定的元素是否存在的话,那又该如何呢?如果你已经使用Java编程多年了,我相信你肯定试过去解析XML,也使用过类似DOM或者SAX这样的解析器,不过很有可能你从未进行过任何的HTML解析的工作.更讽刺的是,在Jav

iOS5系统API和5个开源库的JSON解析速度测试

   iOS5系统API和5个开源库的JSON解析速度测试 iOS5新增了JSON解析的API,我们将其和其他五个开源的JSON解析库进行了解析速度的测试,下面是测试的结果和工程代码附件.   我们选择的测试对象包含下面的这几个框架,其中NSJSONSerialization是iOS5系统新增的JSON解析的API,需要iOS5的环境,如果您在更低的版本进行测试,应该屏蔽相应的代码调用.   - [SBJSON (json-framework)](http://code.google.com/p

开源库Undobar简单使用解析

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

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++通用框架

Android非常有用的开源库介绍整理

Android开源库 自己一直很喜欢Android开发,就如博客副标题一样,我想做个好的App. 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会不定期的更新这篇文章. 本文的其他贡献者: ____sky____ 感谢~ 我的GitHub Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以查看我的GitHub Star,过滤Java选项,每一个库都是我认真查看或者

2015 年度 Android 开发者必备的 5 个开源库

本文讲的是2015 年度 Android 开发者必备的 5 个开源库, 在2014年6月,我们发表了一篇关于5 个顶级 Android 开源库的文章,我们一直在用,并且相信每个 Android 开发者都应该了解这些开源库.从那之后,Android 方面已经发生了很多变化,所以我们写了这篇文章,我们最喜欢的5个开源库的更新版. 下面是更新列表: 1. Retrofit 当涉及到实现 REST APIs 时,Retrofit 仍是我们的最爱. 他们的网站上写着: "Retrofit 将 REST A

Linux 后台开发工作中常用的开源库

后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. 下载地址: https://www.openssl.org/source/ 2.TinyXML tinyxml 简单,高效,灵活的一套操作 XML 文件的开源库. 下载地址: http://www.grinninglizar

Android开发之常用开源库直接拿来用

1.from  代码家 整理比较好的源码连接 *************************************************************************************************************************************************************************** http://blog.zhan-dui.com/?page_id=60 感谢 "代码家"整理 一.