有這么一個需求: 在Android常用的EditText中万皿,設(shè)置固定的左側(cè)文字演熟,不影響接著的輸入(如下圖所示,其中輸入金額的部分,只能輸入數(shù)字或者小數(shù)點聊品,而左側(cè)的人民幣符號是固定的)?
或許有人可能會通過檢測輸入來做判斷欺缘,也有的會通過一個相對布局+一個放左邊的textview+一個放右邊的edittext來實現(xiàn)效果袜硫,但是這樣也是相當(dāng)?shù)穆闊┑模y道不是么晌端?
而其實只要了解簡單的自定義View繪制捅暴,ding'yi就能很快解決需求的了。
- 測出需要固定文字的長度
- 設(shè)置EditText的padding咧纠,讓其留出位置繪制需要固定的文字
- 通過onDraw(Canvas canvas)方法蓬痒,繪制文字,這里需要注意到的是漆羔,通過 canvas.drawText(text,x,y,paint)方法繪制文字的時候梧奢,y應(yīng)該是getBaseline()狱掂,而不是文字的左側(cè)頂點,這也是剛接觸這個容易弄混的點亲轨。
下面直接放出設(shè)置左側(cè)固定文字的代碼:
/**
* 左邊有固定文字EditText
*/
public class FixedEditText extends EditText {
private String fixedText;
private View.OnClickListener mListener;
private int leftPadding;
public FixedEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setFixedText(String text) {
fixedText = text;
leftPadding = getPaddingLeft();
int left = (int) getPaint().measureText(fixedText) + leftPadding;
setPadding(left, getPaddingTop(), getPaddingBottom(), getPaddingRight());
invalidate();
}
public void setDrawableClick(View.OnClickListener listener) {
mListener = listener;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!TextUtils.isEmpty(fixedText)) {
canvas.drawText(fixedText, leftPadding, getBaseline(), getPaint());
// 通過下面的代碼趋惨,可以查看出文字的基線,以及view的中線
// Paint p = new Paint();
// p.setStrokeWidth(1);
// p.setColor(Color.parseColor("#ff0000"));
// canvas.drawLine(0, getBaseline(), getMeasuredWidth(), getBaseline(), p);
// canvas.drawLine(0, getMeasuredHeight() / 2, getMeasuredWidth(), getMeasuredHeight() / 2, p);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mListener != null && getCompoundDrawables()[2] != null) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int i = getMeasuredWidth() - getCompoundDrawables()[2].getIntrinsicWidth();
if (event.getX() > i) {
mListener.onClick(this);
return true;
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
}
return super.onTouchEvent(event);
}
}