不知你是否清楚,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 | 设置字体 |
使用方式
- build引入
compile 'com.sunfusheng:marqueeview:1.3.3'
- 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"/>
- 设置字符串列表数据,或者设置自定义的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);
- 设置字符串数据
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 | 动画执行时间 |
inAnimation | marquee in动画 |
outAnimation | marquee out动画 |
autoStart | 动画是否自动开始 |
animateFirstView | 当前ChildView第一次是否动画展示 |
SimpleMarqueeView属性(支持MarqueeView所有属性及以下属性
)
Attribute 属性 | Description 描述 |
---|---|
smvTextSize | 文字大小 |
smvTextColor | 文字颜色 |
smvTextGravity | 文字位置 |
smvTextSingleLine | 文字是否单行显示 |
smvTextEllipsize | 文字显示不下时,系统的处理方式(可选:none,start,middle,end) |
使用方式
- build引入
implementation 'com.gongwen:marqueelibrary:1.1.3'
- 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" />
- 设置数据
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>