Android圆角控件之EditText

235 阅读2分钟

我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!

  • RoundedEditText

  • 思路 继承AppCompatEditText来重写EditText控件,原本的EditText控件的属性我们不用去改动,因为基本功能我们是需要的,我们只是需要去增加一些其他功能,这里主要是增加了四个方向的圆角,边框颜色,自定义路径裁剪。 它们都是怎么实现的呢!

  • 圆角实现 主要利用了addRoundRect函数来实现,

     RectF rectF = new RectF(0, 0, mWidth, mHeight);
     path.addRoundRect(rectF, RadiusaRcs, Path.Direction.CCW);
     canvas.drawPath(path, paint);
    
  • 代码

/**
 * 圆角线性布局
 * 1.支持四个方向圆角 ✅
 * 2.支持边框颜色 ✅
 * 3.支持自定义路径裁剪 ✅(不支持xml属性定义)
 */
public class RoundedEditText extends androidx.appcompat.widget.AppCompatEditText implements RoundMethodInterface {
    private RoundHelper mHelper = new RoundHelper();
    private Context context;
    private AttributeSet attributeSet;

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

    public RoundedEditText(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,-1);
    }

    public RoundedEditText(Context context, @Nullable AttributeSet attrs,int defStyleAttr) {
        super(context, attrs,defStyleAttr);
        if (this.context == null) {
            this.context = context;
        }
        if (this.attributeSet == null) {
            this.attributeSet = attrs;
        }
        init();
    }


    private void init() {
        mHelper.init(context, attributeSet, this, getBackground());
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mHelper.onSizeChanged(w, h);
    }

    @Override
    public void draw(Canvas canvas) {
        mHelper.preDraw(canvas);
        super.draw(canvas);
        mHelper.drawPath(canvas);
    }

    @Override
    public void setRadius(float radiusDp) {
        mHelper.setRadius(radiusDp);
    }

    @Override
    public void setRadius(float radiusTopLeftDp, float radiusTopRightDp, float radiusBottomLeftDp, float radiusBottomRightDp) {
        mHelper.setRadius(radiusTopLeftDp, radiusTopRightDp, radiusBottomLeftDp, radiusBottomRightDp);
    }

    @Override
    public void setRadiusLeft(float radiusDp) {
        mHelper.setRadiusLeft(radiusDp);
    }

    @Override
    public void setRadiusRight(float radiusDp) {
        mHelper.setRadiusRight(radiusDp);
    }

    @Override
    public void setRadiusTop(float radiusDp) {
        mHelper.setRadiusTop(radiusDp);
    }

    @Override
    public void setRadiusBottom(float radiusDp) {
        mHelper.setRadiusBottom(radiusDp);
    }

    @Override
    public void setRadiusTopLeft(float radiusDp) {
        mHelper.setRadiusTopLeft(radiusDp);
    }

    @Override
    public void setRadiusTopRight(float radiusDp) {
        mHelper.setRadiusTopRight(radiusDp);
    }

    @Override
    public void setRadiusBottomLeft(float radiusDp) {
        mHelper.setRadiusBottomLeft(radiusDp);
    }

    @Override
    public void setRadiusBottomRight(float radiusDp) {
        mHelper.setRadiusBottomRight(radiusDp);
    }

    @Override
    public void setStrokeWidth(float widthDp) {

    }

    @Override
    public void setStrokeColor(int color) {

    }

    @Override
    public void setBlur(int num) {

    }

    @Override
    public void setTargetBitmap(Bitmap bitmap) {

    }

}
  • 使用属性

rRadius
rLeftRadius
rRightRadius
rTopRadius
rBottomRadius
rTopLeftRadius
rTopRightRadius
rBottomLeftRadius
rBottomRightRadius
rStrokeWidth
rStrokeColor
blur
lineargradientColor
lineargradientWeight
lineargradientDirectionType

  • 使用方法

setRadius(float radiusDp)
setRadius(float radiusTopLeftDp, float radiusTopRightDp, float radiusBottomLeftDp, float radiusBottomRightDp)
setRadiusLeft(float radiusDp)
setRadiusRight(float radiusDp)
setRadiusTop(float radiusDp)
setRadiusBottom(float radiusDp)
setRadiusTopLeft(float radiusDp)
setRadiusTopRight(float radiusDp)
setRadiusBottomLeft(float radiusDp)
setRadiusBottomRight(float radiusDp)
setStrokeWidth(float widthDp)
setStrokeColor(int color)
setBlur(int num)
setTargetBitmap(Bitmap bitmap)
setImage 方法是RoundImageView独有其它控件没有此方法,如果需要在代码中进行图片的加载调用此方法进行图片的加载,如果需要加载网络图片可以直接使用gilde进行图片的加载,然后再配合需要的高斯模糊或者其它处理,针对gilde网络图片的异步加载问题已经处理完毕,不需要再做其它处理
setImage(int resId)
setImage(Drawable drawable)

  • 效果图

image.png