textview 跑马灯效果,用XML 方式实现了,但是一旦执行 setText(); 跑马灯效果就消失了
第一种:
控件类:AutoScrollTextView 继承了TextView并做了一些修改,实现了宽度的判断,文本自动滚动及开始和停止滚动等功能。
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;
public class AutoScrollTextView extends TextView implements OnClickListener {
}
xml中使用方法:
Activity中使用方法:
注:如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init方法,重新进行初始化和相关参数的计算。
第二种:
publicclassAlwaysMarqueeTextViewextendsTextView{
publicAlwaysMarqueeTextView(Contextcontext){
super(context);
}
publicAlwaysMarqueeTextView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
publicAlwaysMarqueeTextView(Contextcontext,AttributeSetattrs,intdefStyle){
super(context,attrs,defStyle);
}
@Override
publicbooleanisFocused(){
returntrue;
}
在布局XML文件中加入这么一个AlwaysMarqueeTextView,这个加入方法也是刚刚学的。
android:id= “@+id/AMTV1″
android:layout_width= “fill_parent”
android:layout_height= “wrap_content”
android:lines= “1″
android:focusable= “true”
android:focusableInTouchMode= “true”
android:scrollHorizontally= “true”
android:marqueeRepeatLimit= “marquee_forever”
android:ellipsize= “marquee”
android:background= “@android:color/transparent”
/>
ellipsize属性
设置当文字过长时,该控件该如何显示。有如下值设置:”start”—–省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)
marqueeRepeatLimit属性
在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。
focusable属性
自己猜测的,应该是能否获得焦点,同样focusableInTouchMode应该是滑动时能否获得焦点。
组合View的问题:
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 = “test marquee .. “
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
this
ViewGroup's drawable states
also include its children's drawable states.