Android 高级UI设计笔记05:使用TextView实现跑马灯的效果

1. 使用TextView属性实现跑马灯的效果:

(1). 新建一个Android工程,命名为"MarqueeTextViewDemo",如下:

Android 高级UI设计笔记05:使用TextView实现跑马灯的效果

(2). 来到activity_main.xml如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.himi.marqueetextviewdemo.MainActivity" > <TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:text="@string/hello_world" /> </RelativeLayout>

(3). 来到MainActivity.java,如下:

 package com.himi.marqueetextviewdemo;

 import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} }

(4). 布署程序到模拟器上,如下:

效果如下:

Android 高级UI设计笔记05:使用TextView实现跑马灯的效果

(5). 总结:

  定义TextView标签的4个属性: 

 android:singleLine="true"//使其只能单行
android:ellipsize="marquee"//是否滚动
android:focusable = "true"// 设置是否获得焦点
android:focusableInTouchMode = "true"//设置在Touch模式下View是否能取得焦点

设置上面属性之后,此时TextView显示文字就会自动循环显示。但是,对于一个大View中有很多子View来说,同一时刻只能有一个子View获得focus!也就是说当前这一屏上,最多只能有一个view能有跑马灯效果,而不能多个View同时都有跑马灯效果。

2. 自定义类MarqueeTextView继承自TextView实现跑马灯的效果:

(1)首先来到了activity_main.xml布局文件,如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.himi.marqueetextviewdemo.MainActivity" > <com.himi.marqueetextviewdemo.MarqueeTextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:text="@string/hello_world" />
<com.himi.marqueetextviewdemo.MarqueeTextView
android:id="@+id/textview2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:layout_marginTop="15dp"
android:text="@string/hello_world" /> </RelativeLayout>

(2)来到了MarqueeTextView继承自TextView,如下:

 package com.himi.marqueetextviewdemo;

 import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView; public class MarqueeTextView extends TextView { public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO 自动生成的构造函数存根
} public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO 自动生成的构造函数存根
} public MarqueeTextView(Context context) {
super(context);
// TODO 自动生成的构造函数存根
} /**
* 复写isfocued方法,返回true(默认都是有焦点,平常只有一个有焦点在第一行上)
* 这样才能确保每一个MarqueeTextView都具备焦点
*/
@Override
public boolean isFocused() {
// TODO 自动生成的方法存根
return true;
} }

(3)来到了MainActivity.java:如下

 package com.himi.marqueetextviewdemo;

 import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} }

(4)运行效果,如下:

Android 高级UI设计笔记05:使用TextView实现跑马灯的效果

总结:

-->1. 自定义类MarqueeTextView继承自TextView

• 实现三个构造函数;
• 复写isfocued方法,返回true(默认都有有焦点)-----> 实现多个View同时都有跑马灯效果,每个使用的MarqueeTextView都要焦点。

   平常只有一个有焦点在第一行上。

-->2. 使用自定义的类,方法是用包名和自定义类名代替TextView(src下的包名+类名)

3. Android系统中TextView实现跑马灯效果,必须具备以下几个条件:

  • android:ellipsize="marquee"
  • TextView必须单行显示,即内容必须超出TextView大小
  • TextView要获得焦点才能滚动
XML代码:
  android:ellipsize="marquee", android:singleLine="true"
Java代码:
  mTVText.setText("哼唱接撒砥砺风节雷锋精神http://orgcent.com/,很长很长很长很长很长很长的数据");
  mTVText.setSingleLine(true);
  mTVText.setEllipsize(TruncateAt.MARQUEE);
PS: TextView.setHorizontallyScrolling(true); //让文字可以水平滑动
 
TextView还可以设置跑马灯效果的滚动次数,如下:
XML代码设置:
  android:marqueerepeatlimit="1"。1代表1次,-1代表无限循环。
Java代码设置:
  mTVText.setMarqueeRepeatLimit(-1);
 
 
 
 
上一篇:记录特殊情况的Python脚本的内存异常与处理


下一篇:Access中出现改变字段“自己主动编号”类型,不能再改回来!(已解决)