美文网首页
Android Edittext增加一键清除按钮

Android Edittext增加一键清除按钮

作者: svvvvvvvL | 来源:发表于2022-05-26 17:15 被阅读0次

    前言

    因为合规的原因, 所有的输入框都得在后面加上一个清除按钮, 直接布局里面添加ImageView虽然也可以, 但是显然需要每个用到的地方都要copy代码, 很是不妥, 所以但是写了这个实现类, 只需要替换到原来的EditTextView就可以了. 清除逻辑已经实现好了.

    效果

    Project Name (1).gif

    实现代码

    kotlin代码部分

    
    class ClearableEditText @JvmOverloads constructor(
        context: Context,
        attributeSet: AttributeSet? = null,
    ) : AppCompatEditText(context, attributeSet) {
    
        private var clearBitmap: BitmapDrawable
        private val paint = Paint()
        private val clearRectF = RectF()
        private val clickDetectRectF = RectF()
    
        init {
    
            val a = context.obtainStyledAttributes(attributeSet, R.styleable.ClearableEditText)
            val drawableId = a.getResourceId(R.styleable.ClearableEditText_cet_clear_drawable, -1)
            val bitmap = if (drawableId == -1) {
                BitmapFactory.decodeResource(resources, R.drawable.mcbd__ic_close_2)
            } else {
                BitmapFactory.decodeResource(resources, drawableId)
            }
            clearBitmap = BitmapDrawable(resources, bitmap)
            a.recycle()
    
            doAfterTextChanged { postInvalidate() }
        }
    
        override fun onTouchEvent(event: MotionEvent?): Boolean {
            if (event?.action == MotionEvent.ACTION_UP) {
                if (!text.isNullOrEmpty() && clickDetectRectF.contains(event.x, event.y)) {
                    text = null
                    return true
                }
            }
            return super.onTouchEvent(event)
        }
    
        override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
            super.onLayout(changed, left, top, right, bottom)
            clearRectF.set(
                measuredWidth - paddingEnd - clearBitmap.intrinsicWidth.toFloat(),
                (measuredHeight - clearBitmap.intrinsicHeight) / 2f,
                measuredWidth - paddingEnd.toFloat(),
                (measuredHeight + clearBitmap.intrinsicHeight) / 2f
            )
            clickDetectRectF.set(
                clearRectF.left - CLICK_EXPAND,
                clearRectF.top - CLICK_EXPAND,
                clearRectF.right + CLICK_EXPAND,
                clearRectF.bottom + CLICK_EXPAND
            )
        }
    
        override fun onDraw(canvas: Canvas?) {
            super.onDraw(canvas)
            if (!text.isNullOrEmpty()) {
                canvas?.drawBitmap(clearBitmap.bitmap, clearRectF.left, clearRectF.top, paint)
            }
        }
    
        companion object {
            //点击范围判定的延伸距离
            private const val CLICK_EXPAND = 20
        }
    }
    

    其中, CLICK_EXPAND这个东西是产品说点击的那个图标太小了, 不好点, 所以专门把点击区域放大了一点点, 如果不需要这个操作,删了就是

    自定义属性部分

        <declare-styleable name="ClearableEditText">
            <attr name="cet_clear_drawable" format="reference"/>
        </declare-styleable>
    

    只有这一个属性, 用于决定后面的清除图标的样式, 如果需要代码中动态设置, 需要改改代码去实现.

    无了

    相关文章

      网友评论

          本文标题:Android Edittext增加一键清除按钮

          本文链接:https://www.haomeiwen.com/subject/igtpprtx.html