仿IOS风格的搜索框

来源:互联网 发布:淘宝举报假冒商品 编辑:程序博客网 时间:2024/06/07 06:15

UI需要android和IOS统一,搜索框为IOS风格,在网上找了一个
【Android自定义控件】仿IOS风格的搜索框

在此基础上,对焦点进行了处理,默认不获得焦点,点击以后得到焦点,并弹出软键盘

/** * 仿IOS搜索框,默认字体居中,点击搜索框,字体移到左侧 */public class SearchEditText extends AppCompatEditText implements View.OnFocusChangeListener, View.OnKeyListener, TextWatcher, View.OnClickListener{    private static final String TAG = "SearchEditText";    /**     * 图标是否默认在左边     */    private boolean isIconLeft = false;    /**     * 是否点击软键盘搜索     */    private boolean pressSearch = false;    /**     * 软键盘搜索键监听     */    private OnSearchClickListener listener;    private Drawable[] drawables; // 控件的图片资源    private Drawable drawableLeft, drawableDel; // 搜索图标和删除按钮图标    private int eventX, eventY; // 记录点击坐标    private Rect rect; // 控件区域    private Context context;    public void setOnSearchClickListener(OnSearchClickListener listener)    {        this.listener = listener;    }    public interface OnSearchClickListener    {        void onSearchClick(View view);        void onTextChanged(String text);        void beforeTextChanged(String text);        void afterTextChanged(String text);        void viewClick();    }    public SearchEditText(Context context)    {        this(context, null);        this.context = context;        init();    }    public SearchEditText(Context context, AttributeSet attrs)    {        this(context, attrs, android.R.attr.editTextStyle);        this.context = context;        init();    }    public SearchEditText(Context context, AttributeSet attrs, int defStyleAttr)    {        super(context, attrs, defStyleAttr);        this.context = context;        init();    }    private void init()    {        //默认不获取焦点        setFocusable(false);        setOnFocusChangeListener(this);        setOnKeyListener(this);        addTextChangedListener(this);        setOnClickListener(this);        //关闭粘贴复制功能        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)        {            setCustomInsertionActionModeCallback(new ActionMode.Callback()            {                @Override                public boolean onCreateActionMode(ActionMode mode, Menu menu)                {                    return false;                }                @Override                public boolean onPrepareActionMode(ActionMode mode, Menu menu)                {                    return false;                }                @Override                public boolean onActionItemClicked(ActionMode mode, MenuItem item)                {                    return false;                }                @Override                public void onDestroyActionMode(ActionMode mode)                {                }            });        }        setLongClickable(false);    /*    SoftKeyBoardListener.setListener(context, new SoftKeyBoardListener.OnSoftKeyBoardChangeListener()        {            @Override            public void keyBoardShow(int height)            {            }            @Override            public void keyBoardHide(int height)            {   //键盘关闭,搜索框失去焦点,显示正常的列表,隐藏搜索列表,设置上拉下拉可用                setFocusable(false);                clearFocus();            }        });                */    }    @Override    public void onClick(View v)    {        if (pressSearch)        {            return;        }        if (!isFocused())        {            //点击控件获取焦点,弹出键盘            setFocusableInTouchMode(true);            requestFocus();            isIconLeft = true;            invalidate();            setHint("请输入关键字");        }        setSelectAllOnFocus(false);        InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);        imm.showSoftInput(this, 0);        /*InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);        imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);*/        if (listener != null)        {            listener.viewClick();        }    }    @Override    protected void onDraw(Canvas canvas)    {        if (isIconLeft)        { // 如果是默认样式,直接绘制            if (length() < 1)            {                drawableDel = null;            }            this.setCompoundDrawablesWithIntrinsicBounds(drawableLeft, null, drawableDel, null);            super.onDraw(canvas);        }        else        { // 如果不是默认样式,需要将图标绘制在中间            if (drawables == null)                drawables = getCompoundDrawables();            if (drawableLeft == null)                drawableLeft = drawables[0];            float textWidth = getPaint().measureText(getHint().toString());            int drawablePadding = getCompoundDrawablePadding();            int drawableWidth = drawableLeft.getIntrinsicWidth();            float bodyWidth = textWidth + drawableWidth + drawablePadding;            canvas.translate((getWidth() - bodyWidth - getPaddingLeft() - getPaddingRight()) / 2, 0);            super.onDraw(canvas);        }    }    @Override    public void onFocusChange(View v, boolean hasFocus)    {        // 被点击时,恢复默认样式        if (!pressSearch && TextUtils.isEmpty(getText().toString()))        {            isIconLeft = hasFocus;        }    }    //点击取消等操作,复原搜索框    public void setDefault()    {        setFocusable(false);        clearFocus();        setText("");        setHint("搜索");        isIconLeft = false;        pressSearch = false;        invalidate();    }    @Override    public boolean onKey(View v, int keyCode, KeyEvent event)    {        pressSearch=false;        //加入&& event.getAction() == KeyEvent.ACTION_DOWN防止执行两次        if (listener != null && event.getAction() == KeyEvent.ACTION_DOWN)        {            pressSearch = (keyCode == KeyEvent.KEYCODE_ENTER);            if (pressSearch)            {                /*隐藏软键盘*/                InputMethodManager imm = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);                if (imm.isActive())                {                    imm.hideSoftInputFromWindow(v.getApplicationWindowToken(), 0);                }                listener.onSearchClick(v);                pressSearch = false;                setFocusable(false);                clearFocus();            }        }        return false;    }    @Override    public boolean onTouchEvent(MotionEvent event)    {// 清空edit内容        if (drawableDel != null && event.getAction() == MotionEvent.ACTION_UP)        {            eventX = (int) event.getRawX();            eventY = (int) event.getRawY();            Log.i(TAG, "eventX = " + eventX + "; eventY = " + eventY);            if (rect == null)                rect = new Rect();            getGlobalVisibleRect(rect);            rect.left = rect.right - drawableDel.getIntrinsicWidth();            if (rect.contains(eventX, eventY))            {                //点击删除按钮,清空文字,关闭软键盘,设置焦点不可用                setText("");                setFocusable(false);                /*隐藏软键盘*/                InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);                if (imm.isActive())                {                    imm.hideSoftInputFromWindow(this.getApplicationWindowToken(), 0);                }                // listener.onSearchClick(this);            }        }// 删除按钮被按下时改变图标样式        if (drawableDel != null && event.getAction() == MotionEvent.ACTION_DOWN)        {            eventX = (int) event.getRawX();            eventY = (int) event.getRawY();            Log.i(TAG, "eventX = " + eventX + "; eventY = " + eventY);            if (rect == null)                rect = new Rect();            getGlobalVisibleRect(rect);            rect.left = rect.right - drawableDel.getIntrinsicWidth();            if (rect.contains(eventX, eventY))                drawableDel = this.getResources().getDrawable(R.drawable.delete_new);        }        else        {            drawableDel = this.getResources().getDrawable(R.drawable.delete_new);        }        return super.onTouchEvent(event);    }    @Override    public void afterTextChanged(Editable arg0)    {        if (this.length() < 1)        {            drawableDel = null;        }        else        {            drawableDel = this.getResources().getDrawable(R.drawable.delete_new);        }        if (listener != null)        {            listener.afterTextChanged(arg0 + "");        }    }    @Override    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)    {        if (listener != null)        {            listener.beforeTextChanged(arg0 + "");        }    }    @Override    public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3)    {        if (listener != null)        {            listener.onTextChanged(arg0 + "");        }    }}
原创粉丝点击