今天,我们将利用TextView控件来实现对一串编辑文字的视觉处理…我们在文本框输的文字多的时候,一般是这个效果
被分成了两行显示,可是如果布局限制了我们的折行,即只能用单行显示的话,我们该怎么做呢?有人会想到TextView的一个属性 android:singleLine=”true”,我们添加进去试试看,效果是这样的
一行显示了,不过多了省略号后面的内容看不到了,显然这个也是不能解决我们问题的方案。下一步我们考虑另一个解决方案,再继续添加属性
android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置:”start”—–省略号显示在开头;”end”——省略号显示在结尾;”middle”— 省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)
我们添加这个属性
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="从前山里有个庙,庙里有个老和尚和小和尚,老和尚给小和尚讲故事,讲什么故事呢..."
android:singleLine="true"
android:ellipsize="marquee"/>
省略号没了,但是还是没有预期的效果
原因在于跑马灯效果需要TextVIew获得当前的焦点(focus)。然而对于TextView这个控件来说,他的默认的Clickable,LongClickable,Focusable,FocusableInTouchMode这四个属性的值都是false,所以跑马灯效果也就不会出来了。为了解决这个问题我们就需要将我们的TextView得到焦点,android:focusable是针对于手机按键有效的,android:focusableInTouchMode是根据屏幕触摸决定的。这里主要涉及android:focusable和android:focusableInTouchMode这两个属性,即把它们都改为true。
android:focusable="true"
android:focusableInTouchMode="true"
这时出现跑马灯的效果了..不过这样还不算解决问题,因为试一下做两个相同的TextView的话,会发现第一个会动,第二个不会动..
于是采用另一个方案了,我们新建一个文件MarqueeTest.java,让MarqueeTest类继承于TestView,并实现它的三个构造函数和一个isFocused()方法
package com.example.marqueedemo;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
public class MarqueeTest extends TextView{
public MarqueeTest(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MarqueeTest(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
}
public MarqueeTest(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
@Override
public boolean isFocused() {
// TODO Auto-generated method stub
return true; //!!!返回true
}
}
要实现自定义类的控件,我们就把原来TextView改为我们自定义的TextView,如下
<com.example.marqueedemo.MarqueeTest
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="从前山里有个庙,庙里有个老和尚和小和尚,老和尚给小和尚讲故事,讲什么故事呢..."
android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"/>
<com.example.marqueedemo.MarqueeTest
android:id="@+id/textview2"
android:layout_below="@id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="从前山里有个庙,庙里有个老和尚和小和尚,老和尚给小和尚讲故事,讲什么故事呢..."
android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"
android:layout_marginTop="10dp"
android:focusableInTouchMode="true"/>
这个时候发现就行了,其实关键在于isFocused()方法,第一个TextView默认的已经得到了焦点,焦点在第一个TextView,第二个TextView就拿不到了。而我们自定义的话都能拿到焦点,所以也就都能实现跑马灯的效果了。
最后我们来总结一点实现跑马灯效果的步骤
1.在layout里面设置TextView三个属性
2.自定义一个TextView的子类,并实现它的三个构造函数,重载它的isFocused()方法
3.让TextView设为我们自定义的控件(类名+包名)