关于Ali Muzaffar大神的AnimatedEditText的优化
来源:互联网 发布:手机易容术软件 编辑:程序博客网 时间:2024/05/02 03:03
关于Ali Muzaffar大神的AnimatedEditText的优化
今天在android论坛上偶然发现一个关于android editText文本输入框输入带动作的文本的demo。于是就去git上下载了这个demo自己研究,demo地址:[ https://github.com/alphamu/AnimatedEditText ],实现效果:
通过其attrs.xml的定义: <declare-styleable name="AnimatedEditText">
<attr name="animationType" format="enum">
<enum name="fromBottom" value="0" />
<enum name="fromRight" value="1" />
<enum name="fromMiddle" value="2" />
<enum name="popIn" value="3" />
</attr>
<attr name="textMask" format="string" />
</declare-styleable>
支持4中文本输入动作。
在使用时出现了一个问题,就是在追加文本的时候可以显示动作,但是如果是插入文本的话,就没有这个动作了。于是查看AnimatedEditText的实现类。查看其onTextChanged方法
@Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { super.onTextChanged(text, start, lengthBefore, lengthAfter); String added = TextUtils.substring(text, start, start + lengthAfter); int textLength = text.length(); if (lengthAfter == 1 && added.equals(" ")) { return; } if (lengthBefore == lengthAfter) { //either swipe/autosuggest did something, or someone edit or paste something //of the same length. mStart = textLength - 1; mEnd = textLength; return; } if (lengthBefore < lengthAfter && textLength == start + lengthAfter) { //if we are adding text & adding it to the end of the line. if (lengthBefore == 0) { //normal case when tapping keyboard. mStart = start; mEnd = start + lengthAfter; } else { //if using auto suggest, it can result in animating the whole word every //time a character is tapped. This forces only the last character to animate. mStart = textLength - 1; mEnd = textLength; } switch (mAnimationType) { case RIGHT_TO_LEFT: animateInFromRight(); break; case MIDDLE_UP: animateInFromMiddle(); break; case POP_IN: animatePopIn(); break; default: animateInFromBottom(); } } else { mStart = 0; mEnd = text.length(); } }
观察其第三个IF判断,在当前的文本长度 == 新添加的文本长度+新添加文本的起始位置的情况下,调用自定义的animate。这里把插入的情况给忽略掉了,导致了插入的时候不会触发自定义animate。总结一下解决办法,这个解决办法是处理popIn的情况,其他情况类似。
popIn的绘制代码:
private void drawGravityLeft(Canvas canvas) { String fixedText = getFixedText(); float fixedTextWidth = mPaint.measureText(fixedText); float startX = getCompoundPaddingLeft(); canvas.drawText(fixedText, startX, getLineBounds(0, null), mPaint); canvas.drawText(getFullText(), mStart, mEnd, startX + fixedTextWidth + mRightOffset, getLineBounds(0, null) + mBottomOffset, mAnimPaint); }
- 插入文本的情况为 新添加的文本长度+插入位置 <= 当前文本长度(添加也是插入的一种情况)
- 修改在绘制popIn动作的代码(如果不修改此处代码,会出现只会绘制插入代码的位置之前的代码)
通过上述的要点可以看出,保证当前插入文本的正确绘制和插入文本位置之后的文本的正确绘制是要点:
/** * @param canvas * @author Muzaffar edit by GMF */ private void drawGravityLeft(Canvas canvas) { String fixedText = getFixedText(); float fixedTextWidth = mPaint.measureText(fixedText); float startX = getCompoundPaddingLeft(); canvas.drawText(fixedText, startX, getLineBounds(0, null), mPaint); CharSequence cs = getFullText(); canvas.drawText(cs, mStart, mEnd, startX + fixedTextWidth + mRightOffset, getLineBounds(0, null) + mBottomOffset, mAnimPaint); String rightText = cs.subSequence(mEnd,cs.length()).toString(); String leftText = cs.subSequence(mStart,mEnd).toString(); float leftTextWidth = mPaint.measureText(leftText + fixedText); canvas.drawText(rightText,startX + leftTextWidth, getLineBounds(0,null),mPaint); }
获取插入文本位置之后的文本,获取插入文本与插入前文本的长度,通过这个长度来确定插入文本之后的文本的位置。
- 关于Ali Muzaffar大神的AnimatedEditText的优化
- ALI的错误不少哦
- ali 最后几道题的解法
- 关于java发射机制调用ali和google json解析器的不同之处
- Ali支付宝的支付问题
- linux好用Ali的源
- 关于Android开发大神的博客汇总
- 一个关于本站前端的大神网站
- 显著性CVPR12年的三篇论文-Ali Borji
- CVPR2012——Ali Borji的三篇saliency
- CVPR2012——Ali Borji的三篇saliency
- 【Floyd+旅行商】【CQBZOJ 2572】Ali 的宝藏
- Ali
- ali
- sunnyxx大神优化UITableViewCell高度计算的那些事
- 复制一些大神的知识-Unity3D、NGUI性能优化方法
- 笔记52 | 优化一段苏基平大神的代码记录
- 关于阅读那些大神的开源库的一些感想
- JavaScript简介
- 经典sql大全
- python计算词频
- [Mac]Mac 操作系统 常见技巧
- Hive使用笔记
- 关于Ali Muzaffar大神的AnimatedEditText的优化
- java程序中乱码的问题
- nginx反代mogilefs实现海量小文件存储
- 动态规划(DP)问题 之 最大连续子段和及其变异问题 (这个标题会不会显得我很专业哈哈哈
- FrameLayout
- 借助Intent实现Android工程中Activity之间Java对象的传递——实现Parcelable接口
- git 命令错误记录
- 温湿度模块 SHT2x 使用手册
- swift学习Swift学习: 从Objective-C到Swift