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.CallbackgetDefaultUIUtil() 功能。工作代码如下:

@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);
    }
}