一、跑马灯
实现单行跑马灯其实很简单,只要注意TextView的五个属性就好,但是遇到多行、页面中有EditText、Dialog就需要注意焦点抢占的问题。
1.1 单行跑马灯
前面提到单行跑马灯只要注意TextView的五个属性,具体如下:
//XML文件
android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
//Java代码
tv.setSingleLine(true);
tv.setEllipsize(TextUtils.TruncateAt.MARQUEE);
tv.setFocusable(true);
tv.setFocusableInTouchMode(true);
tv.setMarqueeRepeatLimit(-1);//设置滚动次数,-1为无限滚动,1为滚动1次
效果如图:
image.png
从效果图中可以看到,一共有三个TextView,但是只有第一个TextView有跑马灯效果,原因是只有第一个TextView抢到了焦点。为了解决这个问题,需要自定义一个TextView。
1.2 多行跑马灯
实现多行跑马灯其实很简单,只需要自定义一个TextView,先看代码:
public class MarqTextView extends TextView {
public MarqTextView(Context context) {
super(context);
}
public MarqTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused() {
return true;
}
}
<com.example.xiacheng.alearning.UI.MarqTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
/>
关键的函数是isFocused()方法,它使得MarqTextView相较于原本的TextView多出允许多组件被聚焦的特性
效果如图:
image.png
1.3 EditText下跑马灯
EditText会抢焦点,因此要在自定义的TextView中加入如下代码:
//焦点改变时回调
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
if (focused) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
}
//这个函数对EditText抢占焦点问题也有效:
@Override
public boolean hasFocus() {
return true;
}
效果图如下:
image.png
1.4 Dialog下跑马灯
当弹出对话框时跑马灯就会停止,因为对话框抢了焦点,因此在自定义TextView中添加如下代码:
//window间焦点改变时回调
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
if (hasWindowFocus)
super.onWindowFocusChanged(hasWindowFocus);
}
效果图:
image.png
二、聊天室效果
xml布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="200dp">
<TextView
android:id="@+id/chat_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:maxLines="10"
android:lines="10"
android:gravity="left|bottom"
android:scrollbars="vertical"/>
</LinearLayout>
<Button
android:id="@+id/chat_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="聊天"
android:onClick="onClick"/>
java代码:
//设置文本的移动方式
chat_tv.setMovementMethod(new ScrollingMovementMethod());
//在按钮中添加聊天记录
chat_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String []chatarry={"从效果图中可以看到","一共有三个TextView","但是只有第一个TextView有跑马灯效果","原因是只有第一个TextView抢到了焦点"};
int a=(int)(Math.random()*10)%4;
String str=String.format("%s \n%s",chat_tv.getText(),chatarry[a]);
chat_tv.setText(str);
}
});
效果图:
image.png
image.png
网友评论