onChildDraw 使项目闪烁
onChildDraw causes the item to flash
我正在尝试创建一个可以滑动关闭但可以撤消的视图。这些项目在 FrameView
内有一个背景和一个前景。我像这样覆盖 ItemTouchHelper.Callback
中的 onChildDraw
:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
if (viewHolder instanceof ItemViewHolder) {
ItemViewHolder holder = (ItemViewHolder) viewHolder;
holder.foreground.setTranslationX(dX);
}
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
一切正常,直到我尝试根据这样的用户操作撤消滑动操作:
foreground.animate()
.translationX(0)
.setDuration(150);
这确实会将实际视图带回其位置,但如果用户再次尝试滑动该项目,则会再次显示背景,并且由于某种原因调用 onChildDraw 时 dX 参数大于屏幕宽度.点击该项目会在一瞬间显示背景视图,然后通常可以关闭前景。我该如何解决这个问题?
解决方案是使用 ItemTouchHelper.Callback
的 getDefaultUIUtil()
功能。工作代码如下:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
if (viewHolder instanceof TrackerListAdapter.ItemViewHolder) {
TrackerListAdapter.ItemViewHolder holder =
(TrackerListAdapter.ItemViewHolder) viewHolder;
getDefaultUIUtil().onDraw(c, recyclerView, holder.foreground, dX, dY, actionState, isCurrentlyActive);
}
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
我正在尝试创建一个可以滑动关闭但可以撤消的视图。这些项目在 FrameView
内有一个背景和一个前景。我像这样覆盖 ItemTouchHelper.Callback
中的 onChildDraw
:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
if (viewHolder instanceof ItemViewHolder) {
ItemViewHolder holder = (ItemViewHolder) viewHolder;
holder.foreground.setTranslationX(dX);
}
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
一切正常,直到我尝试根据这样的用户操作撤消滑动操作:
foreground.animate()
.translationX(0)
.setDuration(150);
这确实会将实际视图带回其位置,但如果用户再次尝试滑动该项目,则会再次显示背景,并且由于某种原因调用 onChildDraw 时 dX 参数大于屏幕宽度.点击该项目会在一瞬间显示背景视图,然后通常可以关闭前景。我该如何解决这个问题?
解决方案是使用 ItemTouchHelper.Callback
的 getDefaultUIUtil()
功能。工作代码如下:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
if (viewHolder instanceof TrackerListAdapter.ItemViewHolder) {
TrackerListAdapter.ItemViewHolder holder =
(TrackerListAdapter.ItemViewHolder) viewHolder;
getDefaultUIUtil().onDraw(c, recyclerView, holder.foreground, dX, dY, actionState, isCurrentlyActive);
}
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}