展会信息港展会大全

android TextView 垂直自动滚动字幕实现
来源:互联网   发布日期:2015-11-25 22:23:03   浏览:6880次  

导读:textview 垂直自动滚动字幕实现前段时间,在网上搜到一个帖子,textview 水平自动滚动字幕的实现,今日项目需要垂直滚动字幕。其实现原理和水品一样。都是重写textview的onD...

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>

摘自fengyoujie的专栏

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港