android TextView 垂直自动滚动字幕实现

android TextView 垂直自动滚动字幕实现

【收藏此文档

textview 垂直自动滚动字幕实现

前段时间,在网上搜到一个帖子,textview 水平自动滚动字幕的实现,今日项目需要垂直滚动字幕。其实现原理和水品一样。都是重写textviewonDraw方法。
实现垂直自动滚动字幕需要2点需要注意
1.
需要根据textview的宽度和字体的大小计算滚动字幕有多少行。实现这个功能,需要重新写两个方法:1.onMeasure,2.onDraw.因为需要获取textview的宽度,于是需要在onMeasure方法里面调用如下代码。具体方法如下:

[java] view plaincopy

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), 0this.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. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值