EditText整体hint
研究b站app的时候发现了一个之前没有见过的效果,于是研究了一下。下面是b站的效果:
在上面这个过程中,我发现:
1.输入框中包含了两个部分的内容,前面带背景的部分A和后面正常输入的部分B;
2.点击删除的时候,正常输入的部分B也是被正常删除的,但是带背景的部分A则是被作为整体删除的。
奈何小生我学习不认真,竟然没有看懂这当中的门道,一度以为这个效果特别高端,还怀疑是通过自定义控件实现的。但是当我查看了EditText&TextView的源码,我肯定他们没有自定义控件(这么复杂的逻辑,他们做不来!)。一定是我忽略了什么东西!
一边看源码,一边问同事,终于让我发现了真相!
如果你抢答“BackgroundColorSpan”,我只能很遗憾的告诉你“回答错误”。少侠,拳头放下,有话咱们好好说。这个地方确实使用了Span,但并不是BackgroundColorSpan,而是ImageSpan。客官,你先喝口热翔,容我跟你分说端详。
第一个问题,为什么BackgroundColorSpan不能胜任?用BackgroundColorSpan能够实现第一特征,为部分文字添加背景,但仅仅是添加背景。这些文字还是各自独立的,不会被当作一个整体来处理,也就是说第二个特征不满足,点击删除的时候还会逐字删除。还有一个不能忍的地方,光标会定位到前半部分的中间。第二个问题,为什么ImageSpan可以?想到了罗老师的一句话,彪悍的人生不需要解释!为什么可以,就是因为我能干!戴好墨镜,我要上图了(你们不要邪恶好不好)。
前面是在windows上做的,后面是在mac上做的(我是不是高端黑?是ps软件版本的问题,不是我大苹果的问题)。
咱们接着鬼扯,提到ImageSpan我们首先想到的是,在文字边上加图片。但这个地方,我们直观的感觉是,这个地方是文本呀!不是图片呀!!!我们换一个角度来考虑这个问题,我们觉得不对劲只是因为跟我们的习惯或者感觉冲突了,我们的习惯和感觉就是对的嘛?我们站在用户的角度来想,我看到了这些内容,我并不关心你放的是文本还是图片。so——这根本就不是个问题!不要怂,就是干!再点击删除键的时候,ImageSpan只相当于一个字符,图片被删除了上面的文字自然全部消失了!第二个特征满足!至于第一个特征,我相信,聪慧如你,自然不是问题!
完结,撒花!
参考文章:《Android textView 添加超链接(三种实现方式)》《android中的spannable的使用》《Android开发技巧:像QQ一样输入表情图像》《关于Android使用TextView+ImageSpan同一行文字图片居中的问题》