Android 自定义View之实现搜索框中的搜索和删除图标

Android实现搜索框代码如下

需要在attrs文件中添加如下代码:

<declare-styleable name="EtSearchTextView">
    <attr name="serachSrc" format="reference"></attr>
    <attr name="serachDeleteSrc" format="reference"></attr>
    <attr name="searchSrcHeight" format="dimension"></attr>
    <attr name="searchDeleteSrcHeight" format="dimension"></attr>
</declare-styleable>

自定义view的实现

public class EtSearchTextView extends android.support.v7.widget.AppCompatEditText implements
        View.OnFocusChangeListener , TextWatcher , TextView.OnEditorActionListener{

    private static final String TAG = "EtSearchTextView";

    private Drawable mSearchDrawable , mDeleteDrawable;//搜索和删除图标
    private float searchSize = 0 , deleteSize = 0;//设置搜索,删除图标的大小
    private OnClickSearchListener mOnClickSearchListener;
    private int mTouchSlop;//发生滑动的最小距离,

    public EtSearchTextView(Context context) {
        this(context , null);
    }

    public EtSearchTextView(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.editTextStyle);
    }

    public EtSearchTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray ta = context.obtainStyledAttributes(attrs , R.styleable.EtSearchTextView);
        searchSize = ta.getDimension(R.styleable.EtSearchTextView_searchSrcHeight , 30);
        deleteSize = ta.getDimension(R.styleable.EtSearchTextView_searchDeleteSrcHeight , 30);
        mSearchDrawable = ta.getDrawable(R.styleable.EtSearchTextView_serachSrc);
        mDeleteDrawable = ta.getDrawable(R.styleable.EtSearchTextView_serachDeleteSrc );
        setImeOptions(EditorInfo.IME_ACTION_SEARCH);
        init();
    }

    private void init(){
        ViewConfiguration configuration = ViewConfiguration.get(getContext());
        mTouchSlop = configuration.getScaledTouchSlop();

        if(mSearchDrawable != null){
            mSearchDrawable.setBounds( 0 , 0 , (int)searchSize ,
                    (int)searchSize);
        }
        if(mDeleteDrawable != null){
            mDeleteDrawable.setBounds( 0 , 0 , (int)deleteSize ,
                    (int)deleteSize);
        }
        showDeleteIcon(false);
        setOnFocusChangeListener(this);
        addTextChangedListener(this);
    }

    public void showDeleteIcon(boolean isShow){
        Drawable deleteDrawable = isShow ? mDeleteDrawable : null;
        setCompoundDrawables(mSearchDrawable , getCompoundDrawables()[1] , deleteDrawable ,
                getCompoundDrawables()[3]);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(!(s.toString()).isEmpty()){
            showDeleteIcon(true);
        }else{
            showDeleteIcon(false);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }

    private float xDown , yDown;
    private float xUp , yUp;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                xDown = event.getX();
                yDown = event.getY();
                break;
            case MotionEvent.ACTION_UP:
                yUp = event.getY();
                xUp = event.getX();
                //我这里是直接写死了,当然也可以自己定义一个属性传过来用来触发点击事件
                if(xUp < 100 && xDown < 100 && Math.abs(xDown - xUp) < mTouchSlop){
                    QBLogUtils.e(TAG , "搜索点击了");
                    if(mOnClickSearchListener != null){
                        mOnClickSearchListener.clickSearch(getText().toString().trim());
                    }
                    return true;
                }else if(xUp > (getWidth() - 100) && xDown > (getWidth() - 100)
                        && Math.abs(xDown - xUp) < mTouchSlop && getCompoundDrawables()[2] != null){
                    setText("");
                    return true;
                }
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        QBLogUtils.e(TAG , "hasFocus : " + hasFocus);
        if(hasFocus){

        }else{

        }
    }

    public void setmOnClickSearchListener(OnClickSearchListener mOnClickSearchListener) {
        this.mOnClickSearchListener = mOnClickSearchListener;
    }

    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if(actionId == EditorInfo.IME_ACTION_SEARCH){
            if(mOnClickSearchListener != null){
                mOnClickSearchListener.clickSearch(getText().toString().trim());
            }
        }
        return false;
    }

    public interface OnClickSearchListener{
        void clickSearch(String searchStr);
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值