我有一个简单的RecyclerView.ViewHolder类,当将数据绑定到视图时,该类使新项目“按比例放大”。使用LinearLayoutManager时,动画看起来不错,但是当使用GridLayoutManager时,行中的所有项目都同时“放大”。
我的目标是使项目彼此“放大”。我不确定如何完成此操作以及如何向每个项目添加此“延迟”。
我能想到的一种方法是跟踪当前位置并为每个动画添加不同的offsetDelay(如果连续第1个项目执行500ms,如果连续第二个项目执行1000ms,依此类推),但是这种方法给了我奇怪的结果:
它对于单行工作正常,但是当我向下滚动时,在上一行的最后一项停止缩放之前,下一行已经开始放大:
有更好的方法吗?谢谢!
我在其中应用动画的ViewHolder类:
public class ItemHolder extends RecyclerView.ViewHolder
{
private TextView txtTitle;
private View viewItem;
public ItemHolder( @NonNull View viewItem )
{
super( viewItem );
this.viewItem = viewItem;
this.txtTitle = itemView.findViewById( R.id.txtTitle );
}
public void bindData( final Item item )
{
this.txtTitle.setText( item.getTitle() );
this.animationScaleIn( this.viewItem );
}
private void animationScaleIn( View view )
{
ScaleAnimation animationScaleIn = new ScaleAnimation( 0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f );
if( this.position % 2f == 0 )
{
animationScaleIn.setDuration( 800 );
}
else
{
animationScaleIn.setDuration( 800 * 2 );
}
view.startAnimation( animationScaleIn );
}
}
这是ItemAdapter:
public class ItemAdapter extends RecyclerView.Adapter
{
private List<Item> items = new ArrayList<>();
public ItemAdapter( final List<Item> items )
{
if( items != null )
this.items = items;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder( @NonNull ViewGroup viewGroup, int position )
{
final View view = LayoutInflater.from( viewGroup.getContext() ).inflate( position, viewGroup, false );
return new ItemHolder( view );
}
@Override
public void onBindViewHolder( @NonNull RecyclerView.ViewHolder viewHolder, int position )
{
((ItemHolder)viewHolder).bindData( this.items.get( position ) );
}
@Override
public int getItemViewType( final int position )
{
return R.layout.item;
}
@Override
public int getItemCount()
{
return this.items.size();
}
}