仿IOS风格的搜索框

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 + "");
        }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值