Android-给你一个不一样的EditText

前两天不记得在什么论坛上面下载了一个demo,今天运行了一下。看了下效果。感觉还不错,
下面是效果图:


可以看到,当我们输入文字的时候,EditText中的hint文字在后面显示,

这种给用户更好的提示,是一种还不错的交互方式。可以用户登录,注册等你觉得可以使用的地方。

说了那么多,下面我们就来看看如何通过自定义EditText来实现这种效果的。

两个最主要的方法分别是:

1.onTextChanged():监听EditText文字发生的变化

protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter)
	{
		super.onTextChanged(text, start, lengthBefore, lengthAfter);

		if (!isHasHint)
		{
			return;
		}

		if (TextUtils.isEmpty(preString) != TextUtils.isEmpty(getText().toString()))
		{

			if (!TextUtils.isEmpty(getText().toString()))
			{
				status = Status.ANIMATION_OUT;

			} else
			{
				status = Status.ANIMATION_IN;
			}

			preString = (String) getText().toString();
			// 记录下时间
			startTime = System.currentTimeMillis();
		}
	}

首先判断是否设置了hint属性,通过判断 EditText 是否为空,设置相应的动画状态。

2.onDraw()方法进行绘制

		if (!isSetPadding)
		{
			// 设置padding,右边的padding需要加上hint文字的宽度
			setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight() + (int) paint.measureText(hintText), getPaddingBottom());
			isSetPadding = true;
		}



// 设置padding,右边的padding需要加上hint文字的宽度 

float maxHintY = getBaseline();
// getBaseline():返回这个控件文本基线的偏移量。如果这个控件不支持基线对齐,那么方法返回-1.

之后根据相应的状态去绘制

switch (status)
		{
		case ANIMATION_IN:
			if (System.currentTimeMillis() - startTime < animInDuration)
			{
				float hintX = getCompoundPaddingLeft() + getScrollX() + (getWidth() - getCompoundPaddingRight() - getCompoundPaddingLeft())
						* (1 - animInInterpolator.getInterpolation((System.currentTimeMillis() - startTime) / animInDuration));
				
				canvas.drawText(hintText, hintX, maxHintY, paint);
				postInvalidate();
			} else
			{
				float hintX = getCompoundPaddingLeft();
				canvas.drawText(hintText, hintX, maxHintY, paint);
			}

			break;
		case ANIMATION_OUT:

			if (System.currentTimeMillis() - startTime < animOutDuration)
			{
				System.out.println("写入文字");
				float hintX = getCompoundPaddingLeft() + getScrollX() + (getWidth() - getCompoundPaddingRight() - getCompoundPaddingLeft())
						* animOutInterpolator.getInterpolation((System.currentTimeMillis() - startTime) / animOutDuration);
				canvas.drawText(hintText, hintX, maxHintY, paint);
				postInvalidate();
			} else
			{
				float hintX = getScrollX() + (getWidth() - getCompoundPaddingRight());
				canvas.drawText(hintText, hintX, maxHintY, paint);
			}

			break;
		case ANIMATION_NONE:

			if (getText().toString().length() == 0)
			{
				float hintX = getCompoundPaddingLeft() + getScrollX();
				canvas.drawText(hintText, hintX, maxHintY, paint);

			} else
			{
				float hintX = getScrollX() + (getWidth() - getCompoundPaddingRight());
				canvas.drawText(hintText, hintX, maxHintY, paint);
			}

			break;
		}

最主要的就是计算hintX的值,它的值直接影响hint位置起始绘制的位置



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值