就像有时候在京东或是淘宝客户端里的首页那样,有时候它会在上面显示一行小字,是跑马灯的样式。而且刚刚也看了imooc上有讲解,就跟着他做,然后在这里写一下笔记。
为了要让TextView实现跑马灯的效果,那么应该有两点要注意的,一个是内容要足够的长,长到在一行里不能完全的显示,另外一个就是TextView的singleLine属性要为true,这样它才不会因为内容过长而会自动回车新建一行。这是实现跑马灯效果的前提。
然后就要在TextView里增加其它几个属性:
//加入这个属性后,文字在屏幕外的部分不会显示为省略号,而是一种淡出的效果
android:ellipsize="marquee"
//让我们的TextView的焦点为true
android:focusable="true"
// 这个也一样是为了获取焦点,不过是根据触摸屏的特性来获取的,那么上面的是根据手机按键来获取焦点的。个中的一些比较复杂的东西,可以参考以下:View的onclick、focusable、focusableInTouchMode属性详解以及跑马灯的实现
android:focusableInTouchMode="true"
那么这是针对只有一个TextView的情况下,那么这种写法是ok的,但如果出现了多个TextView,即使设置了相同的东西,但显示的结果是第一个TextView是可以运行的,而剩下的则不能运行。原因可能是当多个TextView存在时,即使做了相同的配置,但第一个TextView按照默认的效果它是拿到了焦点,就导致了其它的TextView不能拿到焦点,从而不能运行。
那么我们需要做的一个解决方法就是重写我们的TextView类,我们可以新建一个类继承TextView,重写它的一些方法。
public class MarqueeText extends TextView
{
public MarqueeText(Context context)
{
super(context);
}
public MarqueeText(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public MarqueeText(Context context, AttributeSet attrs, intdefStyleAttr)
{
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused()
{
return true;
}
}
那么这里的key就是最后一个方法isFocused(),我们让它返回true,也就让每个TextView都能get到焦点。当然,最后我们要把布局里的TextView改为我们的这个类:
<com.example.jdnew.marqueetext.MarqueeText
android:id="@+id/text1"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"/>
这样就做完了跑马灯的效果,但从某种程度上来说,当我在运行的过程中,点击菜单键或是EditText等其它控件时,它的跑马灯效果会停止,回到初始状态,一旦重新获得焦点的时候,它就继续跑。但这绝对不是我们想要的完美的效果,而我现在也还不知道怎么去做,就先留个记号吧。
(待续。。。)
参考:慕课网:Android攻城狮的第二门课