产品需求要做一个消息垂直滚动的效果,如图所示,看了一遍基本都是用ViewsFlipper或者TextSwitcher来实现,这里就不对这两种实现方式做过多的介绍,有兴趣的可以自己尝试一下。在这个效果中使用了 AdapterViewFlipper
首先来看看效果图
1,AdapterViewFilpper 继承 了AdapterViewAnimator,它也会显示 Adapter 提供的多个 View 组件,但它每次只能显示一个View组件,程序可通过showPrevious()和showNext()方法控制该组件显示上一个、下一个组件。
2,AdapterViewFilpper可以在多个View切换过程中使用渐隐渐显的动画效果。除此之外,还可以调用该组件的startFlipping()控制它“自动播放”下一个View组件。
常用的AdapterViewFilpper的xml中的属性
android:animateFirstView 设置显示该组件的第一个View时是否使用动画
android:inAnimation 设置组件显示时使用的动画
android:loopViews 设置循环到最后一个组件后是否自动“转头”到第一个组件
android:outAnimation 设置组件隐藏时使用的动画
android:autoStart 设置显示该组件是否是自动播放
android:flipInterval 设置自动播放的时间间隔
其中前四个属性是继承自父类AdapterViewAnimator,后两个autoStart和flipInterval是在AdapterViewFlipper自身中定义的。
在布局文件中添加:
两个动画文件:注意,注意,注意是放在res目录下的animator文件夹不是anim
roll_news_out
roll_news_in
Activity中
//贴出关于AdapterViewFlipper的代码,其他无关代码就不贴上来了
@BindView(R.id.fol_avf)
AdapterViewFlipper viewFlipper;
private ViewFlipperAdapter flipperAdapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
flipperAdapter = new ViewFlipperAdapter(this.getActivity2());
//allRollNews是自定义的消息数据实体类
flipperAdapter.setAllList(allRollNews);
viewFlipper.setAdapter(flipperAdapter);
}
adapter:
public class ViewFlipperAdapter extends BaseAdapter {
private List allList = new ArrayList<>();
private Context context;
private SpannableString spannableString;
public ViewFlipperAdapter(Context context) {
this.context = context;
spannableString = new SpannableString("");
}
public List getAllList() {
return allList;
}
public void setAllList(List allList) {
this.allList = allList;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return allList.size();
}
@Override
public Object getItem(int position) {
return allList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
FlippterViewHolder holder = null;
if (view == null) {
holder = new FlippterViewHolder();
view = LayoutInflater.from(context).inflate(R.layout.item_roll_news, null, false);
holder.mTextView = view.findViewById(R.id.irn_news);
view.setTag(holder);
} else {
holder = (FlippterViewHolder) view.getTag();
}
holder.mTextView.setText(Html.fromHtml(allList.get(position).getNews()));
return view;
}
private class FlippterViewHolder {
TextView mTextView;
}
}
其中RollNewBean是自定义的实体类,这里可以替换成自己适配的数据类型
item_roll_news