自定义带字数统计和限制的EditText

自定义view的学习资料请参考洋神的自定义系列~

【Android 自定义控件之起步】

【Android 自定义控件实战】

 

先上效果图:

额,写的个固定的高度~

效果是这样,统计字符一直在右下角

xml:

<com.cyber.custom.view.CustomEditText
        android:id="@+id/upcom_detail_et_log_content"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_margin="@dimen/activity_margin_all"
        android:layout_weight="1"
        android:enabled="true"
        android:gravity="top"
        android:hint="@string/log_hint"
        android:inputType="textMultiLine"
        android:maxLength="200" />

代码,注意的地方都写在注释里了~╮(╯▽╰)╭


 

/**
 * 自定义带字数统计的editText
 * @author sen
 *
 */
public class CustomEditText extends EditText{
	private EditText edit;
	private Paint mPaint;//画笔
	private Rect mBound;//文本绘制的范围
	private int editWidth;//输入框的宽高
	private int editHeight;
	
	private int numLength = 200;
	private String numStr = "0    /"+numLength;//咳咳,没空格字数到百位了绘制的字数统计就撮到屏幕外面去了,有更好的方式的话请指教
	private int numSize = 18;//字数统计的大小
	public CustomEditText(Context context) {
		this(context,null);
	}
	public CustomEditText(Context context, AttributeSet attrs) {
		super(context,attrs);
		edit = this;
		//设置最多输入的字数
		edit.setFilters(new InputFilter[]{new InputFilter.LengthFilter(numLength)});
		mPaint = new Paint();
		int colorGray = getResources().getColor(R.color.gray);
		mPaint.setColor(colorGray);
		mPaint.setTextSize(numSize);
		mBound = new Rect();
		//初始化时候获取统计str的最小矩形的长宽。
		mPaint.getTextBounds(numStr, 0, numStr.length(), mBound);
		edit.setPadding(10, 0, 10, 20);
		
		//因为在绘制之前就会得到控件的宽高,即0和0,所以要强制在绘制完成之后再拿一次宽高才有正确数值
		ViewTreeObserver viewTreeObserver = this.getViewTreeObserver();
		viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			@Override
			public void onGlobalLayout() {
				edit.getViewTreeObserver().removeGlobalOnLayoutListener(this);
				editWidth = edit.getWidth();
				editHeight = edit.getHeight();
			}
		});	
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		//绘制字数统计
		//-10 -5真的是无奈,px微调的话适配应该问题不大吧╮(╯▽╰)╭
		canvas.drawText(numStr, editWidth-mBound.width()-10, editHeight-mBound.height()-5, mPaint);
	}
	@Override
	protected void onTextChanged(CharSequence text, int start,
			int lengthBefore, int lengthAfter) {
//		super.onTextChanged(text, start, lengthBefore, lengthAfter);
		editHeight = getHeight();//目的在edit输入到第二行的时候刷新一下edit的高度重绘字数统计的高度
		int num = text.length();
		numStr = num+"/"+numLength;
		/*刷新该界面
         * invalidate()是用来刷新View的,必须是在UI线程中进行工作。
         * invalidate()得在UI线程中被调动,在工作者线程中可以通过Handler来通知UI线程进行界面更新。
         *而postInvalidate()在工作者线程中被调用
         * */
		postInvalidate();
		//重绘
		//requestLayout(); 区别在于绘制时候会不会重新测量位置即onMeaure,这个会重新归整位置
		invalidate();
	}
	public void setEditHint(String str){
		edit.setHint(str);
		//重绘
		requestLayout();
	}
}


直接可以拿来用~~~就不上demo了.

 

共勉~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值