业务场景:滚动条的应用有很多,消息轮播、公告等等,接下来给出一种实现的方法,并且该方法实现了跑马灯的多种自定义的滚动条件,可根据具体需求删减
一、实现
1.1 首先,我们需要创建好一个java类和对应的layout下的xml文件,接下来首先在xml中创建一个TextView组件
<TextView
android:id="@+id/runTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top"
android:layout_marginLeft="12dp"
android:layout_marginTop="50dp"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textColor="#000000"
android:textSize="36sp"
android:paddingLeft="90dp" />
注:这里TextView组件的设置与下文类中代码的设置是有重复的,可自行删减
1.2 接下来,我们在对应类中添加全局变量:
TextView marqueeText;
// 在类的成员变量中保存Runnable的引用
private Runnable hideRunnable;
// 在类的成员变量中保存Runnable的引用
private Runnable scrollRunnable;
private Runnable requestRunnable;
private Handler handler = new Handler();
1.3 onCreate方法中添加:
marqueeText = findViewById(R.id.runTextView);
marqueeText.bringToFront();
1.4 封装出可以随时调用跑马灯方法:
void runText(String text){
Log.i("show text","the runner text is :" + text);
int addTime = 0;
isSwitchVideo = "";
//设置滚动条长度为五个字符 宽度
Paint paint = new Paint();
paint.setTextSize(marqueeText.getTextSize());
float width = paint.measureText("国") * 25; //假设“国”是最宽的字符
ViewGroup.LayoutParams params = marqueeText.getLayoutParams();
params.width = (int) width;
marqueeText.setLayoutParams(params);
// 在runText方法的开始处取消之前的Runnable
if (hideRunnable != null) {
marqueeText.removeCallbacks(hideRunnable);
}
// 在runText方法的开始处取消之前的Runnable
if (scrollRunnable != null) {
handler.removeCallbacks(scrollRunnable);
}
// 将滚动条设置为可见
marqueeText.setVisibility(View.VISIBLE);
marqueeText.setText(text);
Log.i(TAG, "-----------runText ---收到打印的消息"+ text);
if (text.length() > 15) {
Log.i(TAG, "--------------15字以上 ---开始滚动");
// 如果文本长度超过五个字符,启动滚动效果
marqueeText.setEllipsize(TextUtils.TruncateAt.MARQUEE);
//这行代码设置了跑马灯的重复次数。在这里,设置为1表示跑马灯效果只会播放一次 -1表示无限循环
marqueeText.setMarqueeRepeatLimit(1);
//这行代码设置了TextView是否可以被选中。在这里,设置为true表示TextView可以被选中,从而启用跑马灯效果。
marqueeText.setSelected(true);
//设置了TextView是否可以水平滚动。在这里,设置为true表示TextView可以水平滚动,以展示整个文本内容。
marqueeText.setHorizontallyScrolling(true);
//这行代码设置了TextView是否只显示一行文本。在这里,设置为true表示TextView只会显示一行文本,多余的文本将被省略
marqueeText.setSingleLine(true);
}else {
Log.i(TAG, "runText text is: " + marqueeText.getText());
addTime = 1000;
}
// 设置跑马灯滚动速度
float density = getResources().getDisplayMetrics().density;
// 在设置新的Runnable时保存它的引用
scrollRunnable = new Runnable() {
@Override
public void run() {
marqueeText.scrollBy((int) (5 * density), 0); // 每次滚动的像素值
handler.postDelayed(this, 80); // 延迟时间,控制滚动速度
}
};
// 在合适的时机开始滚动
handler.postDelayed(scrollRunnable, 1500); // 延迟1秒后开始滚动
// 在设置新的Runnable时保存它的引用
hideRunnable = new Runnable() {
@Override
public void run() {
//滚动完毕后隐藏
marqueeText.setVisibility(View.GONE);
}
};
marqueeText.postDelayed(hideRunnable, getScrollingDuration(text) + addTime);
}
// 滚动条展示的时间设置
private long getScrollingDuration(String text) {
if(text.length() < 1){
return 500;
}
return text.length() / 4 * 1000L;
}
1.5 调用方式,仅仅需要在想展示的地方调用即可:
runText(text);