Android进阶之路 - 横、纵跑马灯无限轮转

本文介绍如何在Android中利用MarqueeView和MarqueeViewLibrary两个第三方库实现跑马灯效果,包括设置动画时间、文字颜色、大小等属性,并提供代码示例。

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

不知你是否清楚,Android中xml属性其实一直自带跑马灯的属性效果,但是因使用不广泛,所以Google并未进行优化扩展,然后更多的人还是选用了三方库 ~

Look here:虽不知你是否因为单行跑马灯效果而来,但是我依旧需要讲一下可以通过类似 final List<String> datas = Arrays.asList("学无止境,时而三思"," ");的方式,将数据源的第二个参数设置为空格,这样单行跑马灯的效果会比较自然好看 ~

blog中MarqueeViewLibrary库应该有借鉴MarqueeView库,然后在其部分基础上进行了二次扩展,具体使用哪款三方库就看自己的选择了 ~

MarqueeView库

主要引用自Github - MarqueeView,关于更详细的使用可自行前往 ~

Effect
这里写图片描述

因该控件是一款自定义控件,所以有一些自定义属性需要了解一下

Attribute 属性Description 描述
mvAnimDuration一行文字动画执行时间
mvInterval两行文字翻页时间间隔
mvTextSize文字大小
mvTextColor文字颜色
mvGravity文字位置:left、center、right
mvSingleLine单行设置
mvDirection动画滚动方向:bottom_to_top、top_to_bottom、right_to_left、left_to_right
mvFont设置字体
使用方式
  1. build引入
 compile 'com.sunfusheng:marqueeview:1.3.3'
  1. xml使用
<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"
    app:mvFont="@font/huawenxinwei"/>
  1. 设置字符串列表数据,或者设置自定义的Model数据类型
MarqueeView marqueeView = (MarqueeView) findViewById(R.id.marqueeView);

List<String> messages = new ArrayList<>();
messages.add("1. 北国风光");
messages.add("2. 千里冰封");
messages.add("3. 万里雪飘");
marqueeView.startWithList(messages);

// 或者设置自定义的Model数据类型
public class CustomModel implements IMarqueeItem {
    @Override
    public CharSequence marqueeMessage() {
        return "...";
    }
}

 List<CustomModel> messages = new ArrayList<>();
 marqueeView.startWithList(messages);

 // 在代码里设置自己的动画
 marqueeView.startWithList(messages, R.anim.anim_bottom_in, R.anim.anim_top_out);
  1. 设置字符串数据
String message = "如果快乐你就拍拍手,如果快乐你就点点头!";
marqueeView.startWithText(message);

// 在代码里设置自己的动画
marqueeView.startWithText(message, R.anim.anim_bottom_in, R.anim.anim_top_out);
注意事项

设置事件监听

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();
    }
});

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

在 Activity 或 Fragment 中

@Override
public void onStart() {
    super.onStart();
    marqueeView.startFlipping();
}

@Override
public void onStop() {
    super.onStop();
    marqueeView.stopFlipping();
}
正式使用

MainActivity

package com.example.yongliu.marqueeview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.sunfusheng.marqueeview.MarqueeView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private MarqueeView marqueeView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        marqueeView = (MarqueeView) findViewById(R.id.marqueeView);
        List<String> info = new ArrayList<>();
        info.add("May be");
        info.add("you");
        info.add("are");
        info.add("best man !");
        // 在代码里设置自己的动画
        marqueeView.startWithList(info, R.anim.anim_bottom_in, R.anim.anim_top_out);
    }

    //解决重影
//    @Override
//    public void onStart() {
//        super.onStart();
//        marqueeView.startFlipping();
//    }

//    @Override
//    public void onStop() {
//        super.onStop();
//        marqueeView.stopFlipping();
//    }
}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.yongliu.marqueeview.MainActivity">

    <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/colorAccent"
        app:mvTextSize="14sp"
        app:mvSingleLine="true"/>

</android.support.constraint.ConstraintLayout>

MarqueeViewLibrary库

主要引用自Github - MarqueeViewLibrary,关于更详细的使用可自行前往 ~

Effect
请添加图片描述

因该控件是一款自定义控件,所以有一些自定义属性需要了解一下

MarqueeView属性

Attribute 属性Description 描述
flipInterval翻页时间间隔
marqueeAnimDuration动画执行时间
inAnimationmarquee in动画
outAnimationmarquee out动画
autoStart动画是否自动开始
animateFirstView当前ChildView第一次是否动画展示

SimpleMarqueeView属性(支持MarqueeView所有属性及以下属性)

Attribute 属性Description 描述
smvTextSize文字大小
smvTextColor文字颜色
smvTextGravity文字位置
smvTextSingleLine文字是否单行显示
smvTextEllipsize文字显示不下时,系统的处理方式(可选:none,start,middle,end)
使用方式
  1. build引入
 implementation 'com.gongwen:marqueelibrary:1.1.3'
  1. xml使用
<com.gongwen.marqueen.SimpleMarqueeView
    android:id="@+id/simpleMarqueeView"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:flipInterval="2500"
    android:inAnimation="@anim/in_right"
    android:outAnimation="@anim/out_left"
    app:marqueeAnimDuration="2000"
    app:smvTextColor="@color/white"
    app:smvTextEllipsize="end"
    app:smvTextGravity="center_vertical"
    app:smvTextSingleLine="true"
    app:smvTextSize="15sp" />
  1. 设置数据
 final List<String> datas = Arrays.asList("《赋得古原草送别》", "离离原上草,一岁一枯荣。", "野火烧不尽,春风吹又生。", "远芳侵古道,晴翠接荒城。", "又送王孙去,萋萋满别情。");
 //SimpleMarqueeView<T>,SimpleMF<T>:泛型T指定其填充的数据类型,比如String,Spanned等
 SimpleMarqueeView<String> marqueeView = (SimpleMarqueeView) findViewById(R.id.marqueeView);
 SimpleMF<String> marqueeFactory = new SimpleMF(this);
 marqueeFactory.setData(datas);
 marqueeView.setMarqueeFactory(marqueeFactory);
 marqueeView.startFlipping();
注意事项

设置监听事件

marqueeView.setOnItemClickListener(new OnItemClickListener<TextView, String>() {
    @Override
    public void onItemClickListener(TextView mView, String mData, int mPosition) {
        /**
        * 注意:
        * 当MarqueeView有子View时,mView:当前显示的子View,mData:mView所填充的数据,mPosition:mView的索引
        * 当MarqueeView无子View时,mView:null,mData:null,mPosition:-1
        */
        Toast.makeText(MainActivity.this, String.format("mPosition:%s,mData:%s,mView:%s,.", mPosition, mData, mView), Toast.LENGTH_SHORT).show();
    }
});

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

@Override
public void onStart() {
    super.onStart();
    marqueeView.startFlipping();
}

@Override
public void onStop() {
    super.onStop();
    marqueeView.stopFlipping();
}
正式使用

MainActivity

package com.example.livedata;

import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProviders;

import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.gongwen.marqueen.SimpleMF;
import com.gongwen.marqueen.SimpleMarqueeView;
//import com.sunfusheng.marqueeview.MarqueeView;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
//        final List<String> datas = Arrays.asList("《赋得古原草送别》", "离离原上草,一岁一枯荣。", "野火烧不尽,春风吹又生。", "远芳侵古道,晴翠接荒城。", "又送王孙去,萋萋满别情。");
        final List<String> datas = Arrays.asList("学无止境,时而三思"," ");
		//SimpleMarqueeView<T>,SimpleMF<T>:泛型T指定其填充的数据类型,比如String,Spanned等
        SimpleMarqueeView<String> marqueeView = findViewById(R.id.simpleMarqueeView);
        SimpleMF<String> marqueeFactory = new SimpleMF(this);
        marqueeFactory.setData(datas);
        marqueeView.setMarqueeFactory(marqueeFactory);
        marqueeView.startFlipping();
    }
}

activity_main

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.gongwen.marqueen.SimpleMarqueeView
        android:id="@+id/simpleMarqueeView"
        android:layout_width="wrap_content"
        android:layout_height="40dp"
        android:flipInterval="2000"
        android:inAnimation="@anim/in_right"
        android:outAnimation="@anim/out_left"
        app:marqueeAnimDuration="2000"
        app:smvTextColor="#333333"
        app:smvTextEllipsize="end"
        app:smvTextGravity="center_vertical"
        app:smvTextSingleLine="true"
        app:smvTextSize="15sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        tools:ignore="MissingConstraints" />
        
</androidx.constraintlayout.widget.ConstraintLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值