因为项目需要,做了一个Android自定义垂直跑马灯,分享给大家。
先上个效果图:
效果图 效果截图从图片中可以看到布局是由包含两个TextView的布局组成,一般的垂直跑马灯效果只支持单个TextView,水平方向的跑马灯更是不需要自定义,原生TextView就支持。
我的需求不只于此,里面的布局复杂,网上的方案已经不满足我的需求,所以我参考别人的垂直跑马灯,自己写了一个支持任意布局的跑马灯效果。代码已上传至GitHub
源码分析见:原文
使用示例:
xml代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.verticalmarquee.maomao.verticalmarqueedemo.VerticalMarqueeLayout
android:id="@+id/marquee_root"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>
Activity代码:
package com.verticalmarquee.maomao.verticalmarqueedemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private VerticalMarqueeLayout marqueeRoot;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
marqueeRoot = findViewById(R.id.marquee_root);
initData();
}
private void initData() {
int count = 5;
List<View> views = new ArrayList<>();
LayoutInflater inflater = LayoutInflater.from(this);
for (int i = 0; i < count; i++) {
views.add(inflateView(inflater, marqueeRoot, "这是标题" + i, "这里是第" + i + "条内容"));
}
marqueeRoot.setViewList(views);
}
private View inflateView(LayoutInflater inflater, VerticalMarqueeLayout marqueeRoot, String name, String desc) {
if (inflater == null) {
inflater = LayoutInflater.from(this);
}
View view = inflater.inflate(R.layout.marquee_item, marqueeRoot, false);
TextView viewName = view.findViewById(R.id.marquee_name);
TextView viewDesc = view.findViewById(R.id.marquee_desc);
viewName.setText(name);
viewDesc.setText(desc);
return view;
}
}
最后修改于2019年5月20日,修改点如下:
- 修复因getCurrentView方法与父类方法重名导致被调用时出现空指针异常。
- 开始启动轮播动画和addView操作添加到post的Runnable里面,为避免在页面未显示前调用导致的异常。这样可以放心在任意地点调用setViewList方法。
赶紧试试吧,祝你成功!!!
(标签:Android、跑马灯)
网友评论