您的位置:首页 > 移动开发 > Android开发

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

2012-12-07 08:47 721 查看
android TextView 垂直自动滚动字幕实现

textview 垂直自动滚动字幕实现

前段时间,在网上搜到一个帖子,textview水平自动滚动字幕的实现,今日项目需要垂直滚动字幕。其实现原理和水品一样。都是重写textview的onDraw方法。
实现垂直自动滚动字幕需要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), 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. }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  textview android