前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android实现文字垂直滚动、纵向走马灯效果的实现方式汇总

Android实现文字垂直滚动、纵向走马灯效果的实现方式汇总

作者头像
砸漏
发布2020-10-29 23:02:58
4.6K1
发布2020-10-29 23:02:58
举报
文章被收录于专栏:恩蓝脚本

方法一、使用系统控件ViewFlipper方式:

布局文件:

代码语言:javascript
复制
<ViewFlipper
    android:id="@+id/view_flipper"
    android:layout_width="300dp"
    android:layout_height="35dp"
    android:layout_centerInParent="true"
    android:autoStart="true"
    android:background="@drawable/warning_bg"
    android:flipInterval="3000"
    android:inAnimation="@anim/slide_in_bottom"
    android:outAnimation="@anim/slide_out_top" 
    <TextView
      android:id="@+id/tv_warning_content1"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:ellipsize="middle"
      android:gravity="center"
      android:singleLine="true"
      android:text="有预警信息有预警信息有预警信息"
      android:textColor="#000000"
      android:textSize="16sp"/ 
    <TextView
      android:id="@+id/tv_warning_content2"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:ellipsize="middle"
      android:gravity="center"
      android:singleLine="true"
      android:text="当前天气状况当前天气状况当前"
      android:textColor="#000000"
      android:textSize="16sp"/ 
    <TextView
      android:id="@+id/tv_warning_content3"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:ellipsize="middle"
      android:gravity="center"
      android:singleLine="true"
      android:text="123456465"
      android:textColor="#000000"
      android:textSize="16sp"/ 
  </ViewFlipper 

背景文件:warning_bg.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
  <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" 
  <solid android:color="#34000000"/ 
  <corners android:radius="80dp"/ 
</shape 

切入动画:slide_in_bottom.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
  <translate
    android:duration="1000"
    android:fromYDelta="100%p"
    android:toYDelta="0" / 
</set 

切出动画:slide_out_top.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
  <translate
    android:duration="1000"
    android:fromYDelta="0"
    android:toYDelta="-100%p" / 
</set 

注意:如果不在布局文件里设置: android:autoStart=”true”, 可以在代码中动态设置开始循环mViewFlipper.startFlipping();

在Activity中显示正常,但在fragment中可能会有重影的现象。

方法二、使用三方框架

Gradle:

代码语言:javascript
复制
compile 'com.sunfusheng:marqueeview:1.3.3'

属性

XML

代码语言:javascript
复制
<com.sunfusheng.marqueeview.MarqueeView
  android:id="@+id/marqueeView"
  android:layout_width="match_parent"
  android:layout_height="30dp"
  app:mvAnimDuration="1000"
  app:mvDirection="bottom_to_top"
  app:mvInterval="3000"
  app:mvTextColor="@color/white"
  app:mvTextSize="14sp"
  app:mvSingleLine="true"/ 

设置字符串列表数据

代码语言:javascript
复制
MarqueeView marqueeView = (MarqueeView) findViewById(R.id.marqueeView);
List<String  info = new ArrayList< ();
info.add("11111111111111");
info.add("22222222222222");
info.add("33333333333333");
info.add("44444444444444");
info.add("55555555555555");
info.add("66666666666666");
marqueeView.startWithList(info);
// 在代码里设置自己的动画
marqueeView.startWithList(info, R.anim.anim_bottom_in, R.anim.anim_top_out);

设置字符串数据

代码语言:javascript
复制
String notice = "心中有阳光,脚底有力量!心中有阳光,脚底有力量!心中有阳光,脚底有力量!";
marqueeView.startWithText(notice);
// 在代码里设置自己的动画
marqueeView.startWithText(notice, R.anim.anim_bottom_in, R.anim.anim_top_out);

设置事件监听

代码语言:javascript
复制
marqueeView.setOnItemClickListener(new MarqueeView.OnItemClickListener() {
  @Override
  public void onItemClick(int position, TextView textView) {
    Toast.makeText(getApplicationContext(), String.valueOf(marqueeView1.getPosition()) + ". " + textView.getText(), Toast.LENGTH_SHORT).show();
  }
});

重影问题可参考以下解决方案

代码语言:javascript
复制
@Override
public void onStart() {
  super.onStart(); 
  marqueeView.startFlipping();
}
@Override
public void onStop() {
  super.onStop();
  marqueeView.stopFlipping();
}

注意:这个库主要还是继承了ViewFlipper,类似的库还有MarqueeViewLibrary,实现方法基本类似,在Activity中显示正常,但在fragment中可能会有重影的现象。

方法三、使用系统控件TextSwitcher实现

布局文件

代码语言:javascript
复制
<TextSwitcher
      android:id="@+id/text_switcher"
      android:layout_width="285dp"
      android:layout_height="35dp"
      android:background="@drawable/warning_bg"/ 

背景文件:warning_bg.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
  <shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" 
  <solid android:color="#34000000"/ 
  <corners android:radius="80dp"/ 
</shape 

代码:

代码语言:javascript
复制
private int index = 0;//textview上下滚动下标
private Handler handler = new Handler();
private boolean isFlipping = false; // 是否启用预警信息轮播
private List<String  mWarningTextList = new ArrayList< ();
private void setTextSwitcher() {
mTextSwitcher.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.slide_in_bottom));
mTextSwitcher.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.slide_out_top));
mTextSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
TextView textView = new TextView(mContext);
textView.setSingleLine();
textView.setTextSize(12);//字号
textView.setTextColor(Color.parseColor("#ffffff"));
textView.setEllipsize(TextUtils.TruncateAt.MIDDLE);
textView.setSingleLine();
textView.setGravity(Gravity.CENTER);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
params.gravity = Gravity.CENTER;
textView.setLayoutParams(params);
textView.setPadding(25, 0, 25, 0);
return textView;
}
});
}
private Runnable runnable = new Runnable() {
@Override
public void run() {
if (!isFlipping) {
return;
}
index++;
mTextSwitcher.setText(mWarningTextList.get(index % mWarningTextList.size()));
if (index == mWarningTextList.size()) {
index = 0;
}
startFlipping();
}
};
//开启信息轮播
public void startFlipping() {
if (mWarningTextList.size()   1) {
handler.removeCallbacks(runnable);
isFlipping = true;
handler.postDelayed(runnable, 3000);
}
}
//关闭信息轮播
public void stopFlipping() {
if (mWarningTextList.size()   1) {
isFlipping = false;
handler.removeCallbacks(runnable);
}
}
//设置数据
private void setData() {
if (mWarningTextList.size() == 1) {
mTextSwitcher.setText(mWarningTextList.get(0));
index = 0;
}
if (mWarningTextList.size()   1) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
mTextSwitcher.setText(mWarningTextList.get(0));
index = 0;
}
}, 1000);
mTextSwitcher.setInAnimation(AnimationUtils.loadAnimation(mContext, R.anim.slide_in_bottom));
mTextSwitcher.setOutAnimation(AnimationUtils.loadAnimation(mContext, R.anim.slide_out_top));
startFlipping();
}
}
@Override
public void onResume() {
super.onResume();
startFlipping();
}
@Override
public void onStop() {
super.onStop();
stopFlipping();
}

切入动画:slide_in_bottom.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
  <translate
    android:duration="1000"
    android:fromYDelta="100%p"
    android:toYDelta="0" / 
</set 

切出动画:slide_out_top.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
  <translate
    android:duration="1000"
    android:fromYDelta="0"
    android:toYDelta="-100%p" / 
</set 

注意:这种方法在Activity和Fragment中均使用正常,可以解决Android文字垂直滚动、纵向走马灯在Fragment中重叠的现象。

总结

以上所述是小编给大家介绍的Android实现文字垂直滚动、纵向走马灯效果的实现方式汇总,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档