前两天不记得在什么论坛上面下载了一个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();
}
}
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位置起始绘制的位置