我正在努力实现的目标
我想在线性垂直RecyclerView中按顺序显示项目.我希望第一个项目出现,然后是第二个项目,然后是第三个项目,依此类推.这是我想要完成的动画类型的一个例子.
我试过的
我已经尝试了这个问题中提供的方法:如何在RecyclerView项目出现时为其设置动画
但是,这并不是我想要完成的.这会导致RecyclerView中的所有项目一次出现,而不是一次出现一次.
我的代码
public class ParentCommentsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private int lastPosition = -1;
//constructor and other code not shown...
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
switch (viewHolder.getItemViewType()) {
case OP:
OPViewHolder ovh = (OPViewHolder) viewHolder;
configureOPViewHolder(ovh, position);
setAnimation(ovh.getContainer(), position);
break;
case COMMENT:
CommentViewHolder cvh = (CommentViewHolder) viewHolder;
configureCommentViewHolder(cvh, position);
setAnimation(cvh.getContainer(), position);
break;
default:
RecyclerViewSimpleTextViewHolder vh = (RecyclerViewSimpleTextViewHolder) viewHolder;
configureDefaultViewHolder(vh, position);
break;
}
}
@Override
public void onViewDetachedFromWindow(final RecyclerView.ViewHolder viewHolder)
{
switch (viewHolder.getItemViewType()) {
case OP:
((OPViewHolder)viewHolder).clearAnimation();
break;
case COMMENT:
((CommentViewHolder)viewHolder).clearAnimation();
break;
default:
break;
}
}
private void configureDefaultViewHolder(RecyclerViewSimpleTextViewHolder vh, int position) {
//code...
}
private void configureOPViewHolder(OPViewHolder vh1, int position) {
//code...
}
private void configureCommentViewHolder(CommentViewHolder vh2, int position) {
//code...
}
private void setAnimation(View viewToAnimate, int position)
{
// If the bound view wasn't previously displayed on screen, it's animated
if (position > lastPosition)
{
Animation animation = AnimationUtils.loadAnimation(context, R.anim.fade_in);
viewToAnimate.startAnimation(animation);
lastPosition = position;
}
}
}
Run Code Online (Sandbox Code Playgroud)
Nik*_*iko 14
打电话后,setAdapter您可以运行以下内容:
recyclerView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
for (int i = 0; i < recyclerView.getChildCount(); i++) {
View v = recyclerView.getChildAt(i);
v.setAlpha(0.0f);
v.animate().alpha(1.0f)
.setDuration(300)
.setStartDelay(i * 50)
.start();
}
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
示例显示了简单的alpha动画,但您可以在循环中运行所需的内容并调整插值器,持续时间和启动延迟.
我决定使用与Niko之前建议的不同的方法.他的方法效果很好而且很容易,但是在添加和删除项目时会导致一些错误的动画(这里可以看到).
所以我决定尝试不同的方法并使用布局动画控制器.这是我用来获得相同结果的代码.
public void initialRVAnimation() {
AnimationSet set = new AnimationSet(true);
// Fade in animation
Animation fadeIn = new AlphaAnimation(0.0f, 1.0f);
fadeIn.setDuration(400);
fadeIn.setFillAfter(true);
set.addAnimation(fadeIn);
// Slide up animation from bottom of screen
Animation slideUp = new TranslateAnimation(0, 0, Utils.getScreenHeight(this), 0);
slideUp.setInterpolator(new DecelerateInterpolator(4.f));
slideUp.setDuration(400);
set.addAnimation(slideUp);
// Set up the animation controller (second parameter is the delay)
LayoutAnimationController controller = new LayoutAnimationController(set, 0.2f);
rv.setLayoutAnimation(controller);
// Set the adapter
adapter = new ItemAdapter(data, this);
recyclerView.setAdapter(adapter);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8871 次 |
| 最近记录: |