textview 垂直自动滚动字幕实现
前段时间,在网上搜到一个帖子,textview水平自动滚动字幕的实现,今日项目需要垂直滚动字幕。其实现原理和水品一样。都是重写textview的onDraw方法。 实现垂直自动滚动字幕需要2点需要注意 1.需要根据textview的宽度和字体的大小计算滚动字幕有多少行。实现这个功能,需要重新写两个方法:1.onMeasure,2.onDraw.因为需要获取textview的宽度,于是需要在onMeasure方法里面调用如下代码。具体方法如下:[java]
1. public VerticalScrollTextView extends TextView {
2. private float step =0f;
3. private Paint mPaint;
4. private String text;
5. private float width;
6. private List<String> textList = new ArrayList<String>(); //分行保存textview的显示信息。
7.
8. public VerticalScrollTextView(Context context, AttributeSet attrs) {
9. super(context, attrs);
10. }
11.
12.
13. public VerticalScrollTextView(Context context) {
14. super(context);
15. }
16.
17. @Override
18. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
19. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
20. width = MeasureSpec.getSize(widthMeasureSpec);
21. final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
22. if (widthMode != MeasureSpec.EXACTLY) {
23. throw new IllegalStateException("ScrollLayout only canmCurScreen run at EXACTLY mode!");
24. }
25.
26. float length = 0;
27. if(text==null|text.length()==0){
28. return ;
29. }
30.
31.
32. //下面的代码是根据宽度和字体大小,来计算textview显示的行数。
33.
34. textList.clear();
35.
36. StringBuilder builder = new StringBuilder();
37. for(int i=0;i<text.length();i++){
38. Log.e("textviewscroll",""+i+text.charAt(i));
39. if(length<width){
40. builder.append(text.charAt(i));
41. length += mPaint.measureText(text.substring(i, i+1));
42. if(i==text.length()-1){
43. Log.e("textviewscroll",""+i+text.charAt(i));
44. textList.add(builder.toString());
45. }
46. }else{
47. textList.add(builder.toString().substring(0,builder.toString().length()-1));
48. builder.delete(0, builder.length()-1) ;
49. length= mPaint.measureText(text.substring(i, i+1));
50. i--;
51. }
52.
53. }
54. }
55.
56.
57. //下面代码是利用上面计算的显示行数,将文字画在画布上,实时更新。
58. @Override
59. public void onDraw(Canvas canvas) {
60. if(textList.size()==0) return;
61. for (int i = 0; i < textList.size(); i++) {
62. canvas.drawText(textList.get(i), 0, this.getHeight()+(i+1)*mPaint.getTextSize()-step, getPaint());
63. }
64.
65. invalidate();
66. step = step+0.3f;
67. if (step >= this.getHeight()+textList.size()*mPaint.getTextSize()) {
68. step = 0;
69. }
70. }
71.
72. }