自定义EditText

这几天想要做一种类似于淘宝App的登录界面,看着淘宝上的EditText真是好看,它换了底线,换了光标。应该是继承EditText后重写的onDrow方法。那么它具体是怎么实现的呢?经过一段时间的摸索后终于实现了类似的效果。

首先我们看看如果更改光标样式
这个主要是这么一个参数:

android:textCursorDrawable

给它配一个shape文件就可以了。关于shape我这里有一篇博客关于shap 可供学习。
这是我写的一个shape文件示例:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <size android:width="1dp"/>
    <solid android:color="@color/colorPrimary"/>
</shape>

然后我们来看看如何更改EditText的底部线
这个就需要继承EditText了,我们先写一个类继承它:

public class MyEditText extends android.support.v7.widget.AppCompatEditText {
public MyEditText(Context context) {
    super(context);
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}
}

这里我们需要写三个构造方法。
然后我们需要定义两个画笔:Paint

private Paint mPaint;
private Paint wPaint;

mPaint用来画一个大矩形
wPaint用来画一个小矩形
这样他两个重叠在一起通过控制就会在底部出来一条线。这样我们就完成了目标。
我们先将画笔初始化:

private void init(){
    Resources resources=getResources();
    paperColor=resources.getColor(R.color.colorPrimary);
    mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setColor(paperColor);
    mPaint.setStyle(Paint.Style.FILL);
    wPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
    wPaint.setColor(resources.getColor(R.color.color_white));
    wPaint.setStyle(Paint.Style.FILL);
}

这样,画笔就被初始化了。
然后,我们重写onDrow方法:

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint);
    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight()-2,wPaint);
    canvas.save();
    super.onDraw(canvas);
    canvas.restore();
}

整体代码就是:

public class MyEditText extends android.support.v7.widget.AppCompatEditText {
private Paint mPaint;
private Paint wPaint;
private int paperColor;
public MyEditText(Context context) {
    super(context);
    init();
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}
private void init(){
    Resources resources=getResources();
    paperColor=resources.getColor(R.color.colorPrimary);
    mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
    mPaint.setColor(paperColor);
    mPaint.setStyle(Paint.Style.FILL);
    wPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
    wPaint.setColor(resources.getColor(R.color.color_white));
    wPaint.setStyle(Paint.Style.FILL);
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint);
    canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight()-2,wPaint);
    canvas.save();
    super.onDraw(canvas);
    canvas.restore();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值