灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:16413回复:1

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

楼主#
更多 发布于:2012-09-06 13:44


textview 垂直自动滚动字幕实现
前段时间,在网上搜到一个帖子,textview 水平自动滚动字幕的实现,今日项目需要垂直滚动字幕。其实现原理和水品一样。都是重写textview的onDraw方法。
实现垂直自动滚动字幕需要2点需要注意
1.需要根据textview的宽度和字体的大小计算滚动字幕有多少行。实现这个功能,需要重新写两个方法:1.onMeasure,2.onDraw.因为需要获取textview的宽度,于是需要在onMeasure方法里面调用如下代码。具体方法如下:
[java]
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文件。如
[html]
<?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">  
<pre name="code" class="html"><pre name="code" class="html"><com.test.VerticalScrollTextView                  
<pre name="code" class="html">                      Android:layout_width="200dp"
            Android:layout_height="300dp"    
                    Android:textSize="20dp"
                    Android:text="好雨知时节, 当春乃发生。随风潜入夜, 润物细无声。野径云俱黑, 江船火独明。晓看红湿处, 花重锦官城"/>
</LinearLayout>



喜欢0 评分0
coolman
精灵王
精灵王
  • 注册日期2013-03-17
  • 发帖数215
  • QQnull
  • 火币958枚
  • 粉丝4
  • 关注3
  • 忠实会员
  • 最爱沙发
沙发#
发布于:2014-01-06 12:43

回复(0) 喜欢(0)     评分
游客

返回顶部