Android 仿淘宝头条 -- 垂直滚动广告条

本文介绍了如何在Android中仿照淘宝头条实现一个基于TextView的垂直滚动广告条。通过ViewFlipper控件,结合自定义布局、进出场动画和逻辑操作,实现了内容的循环滚动。此外,还探讨了ViewFlipper与ViewPager的区别以及常用属性和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言介绍

今天我们来实现淘宝APP上 《淘宝头条》基于TextView实现上下滚动循环通知消息的效果。

在这里我们主要通过 ViewFlipper 也就是安卓自带的控件实现的。
很多人可能都很少知道这个控件,这个控件很简单,也很好理解,操作也不是特别困难 (当然这个也因人而异 ,因难易系数而定)

效果图

在这里插入图片描述

操作步骤

1. 先来看整体的页面布局

  • tvTao:此 TextView 控件输入的内容为 淘宝头条
  • viewFen:此 View 控件 充当为样式,分割左右两个控件
  • filpper:此 ViewFlipper 控件可以使内容进行垂直循环滚动
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fff"
    android:orientation="horizontal"
    tools:context=".textScollView.MarqueeNewsActivity">

    <TextView
        android:id="@+id/tvTao"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_margin="8dp"
        android:padding="8dp"
        android:text="淘宝头条"
        android:textColor="@android:color/holo_red_light"
        android:textSize="22sp" />

    <View
        android:id="@+id/viewFen"
        android:layout_width="0.5dp"
        android:layout_height="match_parent"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:background="@android:color/darker_gray" />


    <ViewFlipper
        android:id="@+id/filpper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:autoStart="true"
        android:flipInterval="3000"
        android:inAnimation="@anim/news_in"
        android:outAnimation="@anim/news_out" />

</LinearLayout>

2. 再看我们自定义的 ViewFlipper 内容的xml布局

  • tvRe:此 TextView 是滚动内容里的显示的 热点
  • tvItem:此TextView 是滚动内容里的主角
  • shape:此处的xml 是自己绘制 白底红边 的圆角背景
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:background="#fff"
    android:gravity="center_vertical"
    android:padding="5dp">

    <TextView
        android:id="@+id/tvRe"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="3dp"
        android:background="@drawable/shape"
        android:padding="5dp"
        android:text="热点"
        android:textColor="@android:color/holo_red_light" />

    <TextView
        android:id="@+id/tvItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:ellipsize="end"
        android:gravity="center_vertical"
        android:padding="5dp"
        android:textColor="#383737" />

</LinearLayout>

shape.xml

  • 在 res -> drawable 文件下创建
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="@android:color/white" />
    <stroke
        android:width="1dp"
        android:color="@android:color/holo_red_light" />

    <corners android:radius="5dp" />

</shape>

3. 设置内容滚动的进出场动画

  • 在使用 ViewFlipper 控件,我们会用到滚动的进出场动画,如下所示:
  • 在对应项目的 res 文件夹下创建 anim文件夹存放动画

new_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500">
    <translate
        android:fromXDelta="0"
        android:fromYDelta="100%p"
        android:toXDelta="0"
        android:toYDelta="0" />
</set>

new_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500">
    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="-100%p" />
</set>

4. 接下来 就是我们具体的逻辑操作

  • initData() :通过List集合存放我们需要滚动的内容
 /**
  * 初始化新闻标题数据
  */
 private void initData() {
     titles = new ArrayList();
     titles.add("没有什么退路,只有咬牙坚持走下去的路!");
     titles.add("今天的你依旧帅气如初 ");
     titles.add("愿十年之后的自己会感谢当初努力奋斗的你");
     titles.add("日子再甜,也没有你甜");
     titles.add("喜欢阿羡也喜欢李现但更喜欢你现(出现)");

 }
  • setViews():赋值滚动内容以及设置视图
  • mviewFlipper :是 ViewFlipper 控件获取id的变量名
  • titles:是存入滚动内容的List集合变量名
  • title_view:是自定义 ViewFlipper 的滚动布局
  /**
   * 为每一页设置视图
   */
  private void setViews() {
  
	  //获取ViewFlipper控件id
      mviewFlipper = (ViewFlipper) findViewById(R.id.filpper);
        
      for (int i = 0; i < titles.size(); i++) {
          View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.title_view, null);
          TextView tvTitle = view.findViewById(R.id.tvItem);
          //赋值
          tvTitle.setText(titles.get(i));
          //动态添加视图
          mviewFlipper.addView(view);
      }

      //设置的时间间隔来开始切换所有的View,切换会循环进行
      mviewFlipper.startFlipping();
      //视图进入动画
      mviewFlipper.setInAnimation(context, R.anim.news_in);
      //视图退出动画
      mviewFlipper.setOutAnimation(context, R.anim.news_out);
      //自动开始滚动
      mviewFlipper.setAutoStart(true);
      //视图的切换间隔
      mviewFlipper.setFlipInterval(3000);
  }

拓展了解

ViewFlipper 和 ViewPager 两者的名字非常相似,效果也很奇妙。
ViewPager 可以理解成 “ 一页一页的视图 ” ;那么 ViewFlipper 则是 “ 快速翻转的视图 ”。
但 ViewFlipper 的使用率却远不及 ViewPager 的频繁, 不过这并不意味着 ViewFlipper 就弱了。 来了解了解鸭!

总结概念

用于两个或更多的View之间的切换,在同一时间内只有一个View将被显示。同时也可以让其自动切换,根据我们给定的时间间隔 。为了让切换效果变的美观,所以我们加入了进入动画和退出动画。

常用属性

1) 这里的属性其实都可以使用代码实现,只不过这里为了代码看上去美观,才放在布局里的

  • android:autoStart:设置自动加载下一个View
  • android:flipInterval:设置View之间切换的时间间隔
  • android:inAnimation:设置切换View的进入动画
  • android:outAnimation:设置切换View的退出动画

2)这里介绍的方法,除了可以设置上面的属性之外,还提供了其他方法

  • startFlipping

开始播放

  • stopFlipping

停止播放

  • isFlipping()

判断是否滑动。

  • autoStart

是否自动切换子View。
true — 自动切换;false — 不自动切换
此时,需要手动调用 startFlipping() / stopFlipping()来启动或停止切换。
该属性对应的方法为:setAutoStart(boolean)

  • setFlipInterval

设置每一个View之间切换的时间的间隔

  • setInAnimation

设置View 进入时候的动画

  • setOutAnimation

设置View退出时候的动画

  • animateFirstView

第一个子View是否显示动画效果
( 注意,这个设置之后并没有看出啥效果 )

  • showNext

显示ViewFlipper里的下一个View

  • showPrevious

显示ViewFlipper里的上一个View

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值