您的位置:首页 > 移动开发 > Android开发

Editiew 有删除图标 和焦点判断

2015-07-02 13:50 411 查看
public class ClearEditText extends EditText implements    

        OnFocusChangeListener, TextWatcher {   

    /** 

     * 删除按钮的引用 

     */  

    private Drawable mClearDrawable;   

    /** 

     * 控件是否有焦点 

     */  

    private boolean hasFoucs;  

   

    public ClearEditText(Context context) {   

        this(context, null);   

    }   

   

    public ClearEditText(Context context, AttributeSet attrs) {   

        //这里构造方法也很重要,不加这个很多属性不能再XML里面定义  

        this(context, attrs, android.R.attr.editTextStyle);   

    }   

      

    public ClearEditText(Context context, AttributeSet attrs, int defStyle) {  

        super(context, attrs, defStyle);  

        init();  

    }  

      

      

    private void init() {   

        //获取EditText的DrawableRight,假如没有设置我们就使用默认的图片  

        mClearDrawable = getCompoundDrawables()[2];   

        if (mClearDrawable == null) {   

//          throw new NullPointerException("You can add drawableRight attribute in XML");  

            mClearDrawable = getResources().getDrawable(R.drawable.delete_selector);   

        }   

          

        mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());   

        //默认设置隐藏图标  

        setClearIconVisible(false);   

        //设置焦点改变的监听  

        setOnFocusChangeListener(this);   

        //设置输入框里面内容发生改变的监听  

        addTextChangedListener(this);   

    }   

   

   

    /** 

     * 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件 

     * 当我们按下的位置 在  EditText的宽度 - 图标到控件右边的间距 - 图标的宽度  和 

     * EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向就没有考虑 

     */  

    @Override   

    public boolean onTouchEvent(MotionEvent event) {  

        if (event.getAction() == MotionEvent.ACTION_UP) {  

            if (getCompoundDrawables()[2] != null) {  

  

                boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())  

                        && (event.getX() < ((getWidth() - getPaddingRight())));  

                  

                if (touchable) {  

                    this.setText("");  

                }  

            }  

        }  

  

        return super.onTouchEvent(event);  

    }  

   

    /** 

     * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏 

     */  

    @Override   

    public void onFocusChange(View v, boolean hasFocus) {   

        this.hasFoucs = hasFocus;  

        if (hasFocus) {   

            setClearIconVisible(getText().length() > 0);   

        } else {   

            setClearIconVisible(false);   

        }   

    }   

   

   

    /** 

     * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去 

     * @param visible 

     */  

    protected void setClearIconVisible(boolean visible) {   

        Drawable right = visible ? mClearDrawable : null;   

        setCompoundDrawables(getCompoundDrawables()[0],   

                getCompoundDrawables()[1], right, getCompoundDrawables()[3]);   

    }   

       

      

    /** 

     * 当输入框里面内容发生变化的时候回调的方法 

     */  

    @Override   

    public void onTextChanged(CharSequence s, int start, int count,   

            int after) {   

                if(hasFoucs){  

                    setClearIconVisible(s.length() > 0);  

                }  

    }   

   

    @Override   

    public void beforeTextChanged(CharSequence s, int start, int count,   

            int after) {   

           

    }   

   

    @Override   

    public void afterTextChanged(Editable s) {   

           

    }   

      

     

    /** 

     * 设置晃动动画 

     */  

    public void setShakeAnimation(){  

        this.setAnimation(shakeAnimation(5));  

    }  

      

      

    /** 

     * 晃动动画 

     * @param counts 1秒钟晃动多少下 

     * @return 

     */  

    public static Animation shakeAnimation(int counts){  

        Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);  

        translateAnimation.setInterpolator(new CycleInterpolator(counts));  

        translateAnimation.setDuration(1000);  

        return translateAnimation;  

    }  

   

   

}  

xml 布局  
 <com.example.test.ClearEditText

        android:id="@+id/editText1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_alignParentLeft="true"

        android:layout_alignParentRight="true"

        android:layout_below="@+id/textView1"

        android:layout_marginTop="26dp"

        android:ems="10" >

        <requestFocus />

    </com.example.test.ClearEditText>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android