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

来源:互联网 发布:51单片机串口程序详解 编辑:程序博客网 时间:2024/05/16 01:36
textview 垂直自动滚动字幕实现

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

package com.test;public VerticalScrollTextView extends TextView {    private float step =0f;      private Paint mPaint;    private String text;    private float width;    private List<String> textList = new ArrayList<String>();    //分行保存textview的显示信息。    public VerticalScrollTextView(Context context, AttributeSet attrs) {        super(context, attrs);            }        public VerticalScrollTextView(Context context) {        super(context);            }        @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {                super.onMeasure(widthMeasureSpec, heightMeasureSpec);        width = MeasureSpec.getSize(widthMeasureSpec);                 final int widthMode = MeasureSpec.getMode(widthMeasureSpec);          if (widthMode != MeasureSpec.EXACTLY) {               throw new IllegalStateException("ScrollLayout only canmCurScreen run at EXACTLY mode!");        }                    float length = 0;                if(text==null|text.length()==0){                return ;        }                          //下面的代码是根据宽度和字体大小,来计算textview显示的行数。        textList.clear();                StringBuilder builder = new StringBuilder();        for(int i=0;i<text.length();i++){            Log.e("textviewscroll",""+i+text.charAt(i));            if(length<width){                builder.append(text.charAt(i));                length += mPaint.measureText(text.substring(i, i+1));                if(i==text.length()-1){                    Log.e("textviewscroll",""+i+text.charAt(i));                    textList.add(builder.toString());                }            }else{                textList.add(builder.toString().substring(0,builder.toString().length()-1));            builder.delete(0, builder.length()-1) ;            length= mPaint.measureText(text.substring(i, i+1));            i--;            }                    }    }    //下面代码是利用上面计算的显示行数,将文字画在画布上,实时更新。     @Override    public void onDraw(Canvas canvas) {       if(textList.size()==0)  return;       for (int i = 0; i < textList.size(); i++) {            canvas.drawText(textList.get(i), 0, this.getHeight()+(i+1)*mPaint.getTextSize()-step, getPaint());        }                    invalidate();            step = step+0.3f;        if (step >= this.getHeight()+textList.size()*mPaint.getTextSize()) {            step = 0;        }            }}

还有一些扩展功能没有加,比方说滚动的速度设定,滚动多长时间就停止滚动。

发上此帖,有任何建议的朋友,欢迎留言,共同讨论。

具体调用方法 写一个layout文件。如

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="300dp"    android:layout_height="400dp"        android:orientation="vertical"> 
<com.test.VerticalScrollTextView                 
                      android:layout_width="200dp"    android:layout_height="300dp"                    android:textSize="20dp"                    android:text="好雨知时节, 当春乃发生。随风潜入夜, 润物细无声。野径云俱黑, 江船火独明。晓看红湿处, 花重锦官城"/></LinearLayout>

 

	
				
		
原创粉丝点击