将 TransitionManager 与 ChangeBounds 结合使用以扩展 RecyclerView 中的项目时,在与 layout_height 结合使用时会产生奇怪的视觉效果:match_constraint
Using TransitionManager with ChangeBounds on expanding item in RecyclerView is making weird visuals when combined with layout_height: match_constraint
我正在为 RecyclerView 使用自定义适配器,我需要在单击项目时展开这些项目。我是按照this用Google推荐的方法实现的。展开工作正常,但使用 TransitionManager.beginDelayedTransition(recyclerView);
的动画并不是我想要的。当我试图在动画期间滚动 RecyclerView 时,也发生了非常奇怪的事情,这会把事情搞砸。
所以我上网寻找不同的动画展开方式。我发现了这个:
final ChangeBounds transition = new ChangeBounds();
transition.setDuration(100L);
TransitionManager.beginDelayedTransition(mRecyclerView,transition);
这非常有效,因为它只会为展开项的行设置动画,然后显示 View.GONE
视图。不涉及 alpha 转换等。但后来我不得不将 RecyclerView 的 layout_height
从 match_parent
更改为 match_constraint
因为软键盘通常会隐藏展开的行(用户可以编辑项目和键盘弹出窗口)。
现在发生了什么: 当我点击展开 RecyclerView 的项目时,它会展开很短的时间,然后回到正常状态,然后开始动画。它制作了非常奇怪的闪烁动画,这很糟糕并且破坏了平滑度。在将 RecyclerView 的 layout_height
设置为 match_parent
之前,它没有这样做,但现在 match_constraint
是。
我正在使用代码来扩展它。按照上面链接的文章。
final boolean isExpanded = position==mExpandedPosition;
// Hidden Views
holder.view1.setVisibility(isExpanded?View.VISIBLE:View.GONE);
holder.view2.setVisibility(isExpanded?View.VISIBLE:View.GONE);
holder.view3.setVisibility(isExpanded?View.VISIBLE:View.GONE);
holder.itemView.setActivated(isExpanded);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mExpandedPosition = isExpanded? -1:holder.getAdapterPosition();
// Animace
final ChangeBounds transition = new ChangeBounds();
transition.setDuration(100L);
TransitionManager.beginDelayedTransition(mRecyclerView,transition);
// Hiding keyboard if it's up
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
notifyDataSetChanged();
}
});
我做的对吗?我可能遗漏了一些基本的东西。我对 Android 开发还很陌生。谢谢!
我找到了解决办法,也许有人会遇到和我一样的问题。
这真是愚蠢的错误。我将 layout_height
设置为 match_constraint
,而不是 layout_width
.
很简单:将 layout_width
设置为 match_constraint
也解决了问题。
我正在为 RecyclerView 使用自定义适配器,我需要在单击项目时展开这些项目。我是按照this用Google推荐的方法实现的。展开工作正常,但使用 TransitionManager.beginDelayedTransition(recyclerView);
的动画并不是我想要的。当我试图在动画期间滚动 RecyclerView 时,也发生了非常奇怪的事情,这会把事情搞砸。
所以我上网寻找不同的动画展开方式。我发现了这个:
final ChangeBounds transition = new ChangeBounds();
transition.setDuration(100L);
TransitionManager.beginDelayedTransition(mRecyclerView,transition);
这非常有效,因为它只会为展开项的行设置动画,然后显示 View.GONE
视图。不涉及 alpha 转换等。但后来我不得不将 RecyclerView 的 layout_height
从 match_parent
更改为 match_constraint
因为软键盘通常会隐藏展开的行(用户可以编辑项目和键盘弹出窗口)。
现在发生了什么: 当我点击展开 RecyclerView 的项目时,它会展开很短的时间,然后回到正常状态,然后开始动画。它制作了非常奇怪的闪烁动画,这很糟糕并且破坏了平滑度。在将 RecyclerView 的 layout_height
设置为 match_parent
之前,它没有这样做,但现在 match_constraint
是。
我正在使用代码来扩展它。按照上面链接的文章。
final boolean isExpanded = position==mExpandedPosition;
// Hidden Views
holder.view1.setVisibility(isExpanded?View.VISIBLE:View.GONE);
holder.view2.setVisibility(isExpanded?View.VISIBLE:View.GONE);
holder.view3.setVisibility(isExpanded?View.VISIBLE:View.GONE);
holder.itemView.setActivated(isExpanded);
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mExpandedPosition = isExpanded? -1:holder.getAdapterPosition();
// Animace
final ChangeBounds transition = new ChangeBounds();
transition.setDuration(100L);
TransitionManager.beginDelayedTransition(mRecyclerView,transition);
// Hiding keyboard if it's up
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
notifyDataSetChanged();
}
});
我做的对吗?我可能遗漏了一些基本的东西。我对 Android 开发还很陌生。谢谢!
我找到了解决办法,也许有人会遇到和我一样的问题。
这真是愚蠢的错误。我将 layout_height
设置为 match_constraint
,而不是 layout_width
.
很简单:将 layout_width
设置为 match_constraint
也解决了问题。