Android 多种跑马灯的方法

转自http://jsf.iteye.com/blog/680257

http://www.devdiv.com/home.php?mod=space&uid=31865&do=blog&id=11360

http://blog.csdn.net/knlnzhao/article/details/7996969

普通的TextView可以实现跑马灯,但是只有当焦点在它上面时才有效。 如何做一个自动的跑马灯呢?


第一种:继承TextView,然后重写isFocused()方法就可以了,简单!

[代码]java代码:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

/**
* 单行文本跑马灯控件
* @author admin
*
*/

public class ScrollForeverTextView extends TextView {

public ScrollForeverTextView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public ScrollForeverTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ScrollForeverTextView(Context context, AttributeSet attrs,int defStyle) {
super(context, attrs, defStyle);
}

@Override
public boolean isFocused() {
return true;
}

}

使用时同TextView一样:

[代码]java代码:

<com.ql.view.ScrollForeverTextView
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:textSize="30px"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:textColor="@color/red" 
android:text="1234567890wwwwwwwwwwwwwwwwwwwwww1234567890"
android:focusable="true"

/>

第2种:还是继承TextView,重写onDraw(),在onDraw中不停的重绘。

[代码]java代码:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.TextView;

/**
* 单行文本跑马灯控件
* @author admin
*/

public class AutoScrollTextView extends TextView implements OnClickListener {
public final static String TAG = AutoScrollTextView.class.getSimpleName();

private float textLength = 0f;// 文本长度
private float viewWidth = 0f;
private float step = 0f;// 文字的横坐标
private float y = 0f;// 文字的纵坐标
private float temp_view_plus_text_length = 0.0f;// 用于计算的临时变量
private float temp_view_plus_two_text_length = 0.0f;// 用于计算的临时变量
public boolean isStarting = false;// 是否开始滚动
private Paint paint = null;// 绘图样式
private CharSequence text = "";// 文本内容
private float speed = 0.5f;
private int textColor=0xFF000000;

public int getTextColor() {
return textColor;
}

public void setTextColor(int color) {
this.textColor = color;
}

public float getSpeed() {
return speed;
}

public void setSpeed(float speed) {
this.speed = speed;
}

public AutoScrollTextView(Context context) {
super(context);
initView();
}

public AutoScrollTextView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}

public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}

/**
* 初始化控件
*/

private void initView() {
setOnClickListener(this);
}

/**
* 文本初始化,每次更改文本内容或者文本效果等之后都需要重新初始化一下!
*/

public void init(float width/*WindowManager windowManager*/) {
text=super.getText();
paint = super.getPaint();
// Paint paint=new Paint();
text = getText().toString();
textLength = paint.measureText(text.toString());
// viewWidth = getWidth();
// if (viewWidth == 0) {
// if (windowManager != null) {
// Display display = windowManager.getDefaultDisplay();
// viewWidth = display.getWidth();
// }
// }

viewWidth=width;
step = textLength;
temp_view_plus_text_length = viewWidth + textLength;
temp_view_plus_two_text_length = viewWidth + textLength * 2;
y = getTextSize() + getPaddingTop();
paint.setColor(textColor);
}

@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.step = step;
ss.isStarting = isStarting;
return ss;
}


@Override
public void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
step = ss.step;
isStarting = ss.isStarting;
}

public static class SavedState extends BaseSavedState {
public boolean isStarting = false;
public float step = 0.0f;
SavedState(Parcelable superState) {
super(superState);
}

@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeBooleanArray(new boolean[] { isStarting });
out.writeFloat(step);
}

public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {

public SavedState[] newArray(int size) {
return new SavedState[size];
}

@Override
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
};

private SavedState(Parcel in) {
super(in);
boolean[] b = null;
in.readBooleanArray(b);
if (b != null && b.length > 0)
isStarting = b[0];
step = in.readFloat();
}
}

/**
* 开始滚动
*/

public void startScroll() {
isStarting = true;
invalidate();
}

/**
* 停止滚动
*/
public void stopScroll() {
isStarting = false;
invalidate();
}

@Override
public void onDraw(Canvas canvas) {
// super.onDraw(canvas);

canvas.drawText(text,0,text.length(), temp_view_plus_text_length - step, y, paint);
if (!isStarting) {
return;
}
step += speed;
if (step > temp_view_plus_two_text_length)
step = textLength;
invalidate();
}

@Override
public void onClick(View v) {
if (isStarting)
stopScroll();
else
startScroll();

}

}

[代码]java代码:

marquee = (AutoScrollTextView) findViewById(R.id.marquee);

// marquee.setText(String.format(getResources().getString(R.string.marquee0),Consts.termno,"2010-12-28"));

marquee.setText("上证指数3000.15 6.81(0.37%)深圳成指3000.15 6.81(0.37%)");

// marquee.setTextColor(0xffff0000);//注意:颜色必须在这里设置,xml中设置无效!默认黑色。
//如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(width)方法,重新进行初始化和相关参数的计算。

marquee.setSpeed(1.5f);
marquee.init(width);//width通常就是屏幕宽!
marquee.startScroll();

这2种跑马灯稍微有点区别,需要掂量着使用。
第1种跑马灯不能设置速度,并且要超过一行才会滚动。
第2种跑马灯只能设置单一颜色,且需要在代码中设置,不能同时设置多种颜色。速度设的不要过大(<=2.0f),否则停顿现象比较明显。

第三种方法:设置其对应的layout中的: addStatesFromChildren= “true”.使用其获得焦点时有跑马灯的效果。

在Android中要显示跑马灯是比较容易的,只要设置2个属性就可以了:
android:singleLine="true"
android:ellipsize="marquee"

但 是要显示跑马灯该View必需是可以取得焦点的,只有在取得焦点的情况下跑马灯才会出现.
如果是组合View的情况下就有问题了, 如下一个组合View:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <? xmlversion="1.0"encoding="utf-8" ?>
< LinearLayout
xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:gravity
="center_vertical"
android:background
="@drawable/f_background"
android:layout_width
="fill_parent"
android:focusable
="true"
android:layout_height
="50px" >
< TextView
android:id ="@+id/info_text"
android:focusable
="true"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
="testmarquee.."
android:textColor
="@color/black"
android:singleLine
="true"
android:ellipsize
="marquee"
android:marqueeRepeatLimit
="3"
android:textSize
="18sp"
/>
< TextView
android:id ="@+id/date_text"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:layout_gravity
="bottom"
android:textColor
="@color/gray"
android:text
="2010/05/28"
android:textSize
="12sp"
/>
</ LinearLayout >


上面示例中2个TextView组合为一个View,由于设置了LinearLayout为focusable而TextView就没法取得焦点了,这样 这个TextView的跑马灯效果就显示不出来,就算你也设置TextView的android:focusable="true" 也是 没用的. 这个时候就要使用addStatesFromChildren 这个属性了,在LinearLayout中设置这个属性,然后设置TextView的focusable="true"就可以了.关于addStatesFromChildren的说明:

Sets whether thisViewGroup's drawablestates also include its children's drawablestates.

可以正常显示的代码:

<!-- <br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> <? xmlversion="1.0"encoding="utf-8" ?>
< LinearLayout
xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:gravity
="center_vertical"
android:background
="@drawable/zixun_background"
android:layout_width
="fill_parent"
android:addStatesFromChildren
="true"
android:layout_height
="50px" >
< TextView
android:id ="@+id/info_text"
android:focusable
="true"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:text
=""
android:textColor
="@color/black"
android:singleLine
="true"
android:ellipsize
="marquee"
android:marqueeRepeatLimit
="3"
android:textSize
="18sp"
/>
< TextView
android:id ="@+id/date_text"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:layout_gravity
="bottom"
android:textColor
="@color/gray"
android:text
="2010/05/28"
android:textSize
="12sp"
/>
</ LinearLayout >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值