原生的TextView在切换内容时有僵硬。
现在我想要这样的效果
-->新的内容会把旧的内容顶上去
原本想用animation来做,虽然也是顶的效果,但是,还不是我想要的效果。
所以我对TextView做了小的变动,不知道有没有性能缺陷,感觉还可以。
效果图:
![](http://osswb.oss-cn-shanghai.aliyuncs.com/image/20160604211333.gif)
制作思路:
-->既然是切换,当然需要2个视图,关键在于如何获取旧的视图
-->有了2个视图,不管什么切换效果都是实现的
遇到的坑:
原本是想用View.getdrawingcache();但是一直获取不到正确的视图。网上的各个方法也使用了,但是View内部来获取drawingcache一直返回是初始的bitmap,一直不变。也就造成尴尬的事,每次切换动画,都是与初始值来切换。以为getdrawingcache()这个方法有问题。但是在外部获取又一切正常。不知道什么原因。所以想到另一个办法,就是把上一个视图直接转成bitmap。
直接上代码
public class WbTextView extends TextView {
private int mOffsetY = 0;
public Bitmap lastBitmap;
public WbTextView(Context context) {
super(context);
}
public WbTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
if (lastBitmap != null) {
canvas.drawBitmap(lastBitmap, 0, mOffsetY - getHeight(), null);
canvas.translate(0, mOffsetY);
}
super.onDraw(canvas);
if (mOffsetY == 0) {
lastBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
super.onDraw(new Canvas(lastBitmap));
}
}
@Override
public void setText(CharSequence text, BufferType type) {
mOffsetY = getHeight();
post(new Runnable() {
@Override
public void run() {
if (mOffsetY > 0) {
mOffsetY -= 5;
if (mOffsetY < 0) mOffsetY = 0;
postDelayed(this, 10);
} else {
mOffsetY = 0;
}
invalidate();
}
});
super.setText(text, type);
}
}
其实也没动多少代码,就是在setText处执行一个Runnable来变化偏移值。
然后在onDraw处根据偏移值来画出动画效果,顺便做一个视图快照。
总结:
总的来说还是比较简洁的,感觉也是一个不错的思路,以后定制效果时也算是一个不错的思路。
尊重作者,转载请注明出处!
版权申明:本文版权归作者所有,未经授权,任何单位或个人不得以任何形式转载、摘编或利用其它方式使用本博客内容。作者保留追究相关法律责任的权利。如需使用博客内容,请与作者联系获得授权。感谢对本文的尊重与支持。
免责声明:本网站所载内容仅供参考,不构成任何专业建议。用户基于本网站内容作出的决策,风险自担。对于因使用本网站内容而产生的任何直接或间接损失,本网站不承担任何责任。请用户审慎判断,理性使用。