android中多种实现跑马灯方法

普通的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);
       }
     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;
     }
}

  1. <com.ql.view.ScrollForeverTextView
  2. android:layout_width="fill_parent"
  3. android:layout_height="wrap_content"
  4. android:textSize="30px"
  5. android:singleLine="true"
  6. android:ellipsize="marquee"
  7. android:marqueeRepeatLimit="marquee_forever"
  8. android:textColor="@color/red"
  9. android:text="1234567890wwwwwwwwwwwwwwwwwwwwww1234567890"
  10. android:focusable="true"

/>

注意:使用时,文字长度一定要超过控件长度,如果控件长度设置为wrap_content则要超过屏幕宽度。

 

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

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;

/** *//**

* TODO 单行文本跑马灯控件
*
* @author tianlu
* @version 1.0
* Create At : 2010-2-16 下午09:35:03
*/
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 String text = "";//文本内容


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(WindowManager windowManager)
{
paint = getPaint();
text = getText().toString();
textLength = paint.measureText(text);
viewWidth = getWidth();
if(viewWidth == 0)
{
if(windowManager != null)
{
Display display = windowManager.getDefaultDisplay();
viewWidth = display.getWidth();
}
}
step = textLength;
temp_view_plus_text_length = viewWidth + textLength;
temp_view_plus_two_text_length = viewWidth + textLength * 2;
y = getTextSize() + getPaddingTop();
}
@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) {
canvas.drawText(text, temp_view_plus_text_length - step, y, paint);
if(!isStarting)
{
return;
}
step += 0.5;
if(step > temp_view_plus_two_text_length)
step = textLength;
invalidate();

}

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

}

}
实现了宽度的判断,文本自动滚动及开始和停止滚动等功能。

在UI xml中的配置如下:

<cn.tigertian.ui.AutoScrollTextView android:id="@+id/TextViewNotice"
android:layout_height="30px" android:layout_width="fill_parent"
android:text="@string/test_notice_1" android:textColor="#000" android:inputType="text"
android:background="#EEE" android:textSize="20px"></cn.tigertian.ui.AutoScrollTextView>

在Activity中的使用方法如下:
//启动公告滚动条
autoScrollTextView = (AutoScrollTextView)findViewById(R.id.TextViewNotice);
autoScrollTextView.init(getWindowManager());
autoScrollTextView.startScroll();

如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(WindowManager windowManager)方法,重新进行初始化和相关参数的计算。

 

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

参考:

http://xiechengfa.iteye.com/blog/1109845

http://apps.hi.baidu.com/share/detail/17301781

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值