【问题标题】:RecyclerView drag highlightRecyclerView 拖拽高亮
【发布时间】:2016-07-13 05:02:39
【问题描述】:

如何更改/删除项目拖动突出显示?我正在使用 ItemTouchHelper 并且我知道我需要使用 onChildDraw 方法做一些事情,但我不想覆盖整个 ACTION_STATE_DRAG 事件,只需要影响拖动项目时出现的那个灰框

我有什么: gray frame

编辑:我注意到框架没有出现在棒棒糖之前的设备上,所以也许我只需要设置一些主题强调色,但我找不到合适的选择器(试过 colorControlActivatedcolorControlHighlight)

【问题讨论】:

  • 什么是灰框?

标签: android android-recyclerview itemtouchhelper


【解决方案1】:

我解决了我的问题。那个灰色的框只是一个元素的高度,即简单的阴影,表示拖动(当你拿起一个要拖动的元素时,它会变得在其他元素之上,所以它有一个阴影;我是这样想的并且是对的)。所以我设置了viewHolder.itemView.setOutlineProvider(null); 并摆脱了它。完整代码在这里:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void setNullOutlineProvider(View view) {
    view.setOutlineProvider(null);
}

@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, 
    RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, 
    boolean isCurrentlyActive) {

    final View view = viewHolder.itemView;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
        setNullOutlineProvider(view);

    if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
        // do some stuff here
    } else {
          super.onChildDraw(c, recyclerView, viewHolder, 
              dX, dY, actionState, isCurrentlyActive);
    }
}

或者最好在您的自定义适配器中进行

【讨论】:

    【解决方案2】:

    覆盖onChildDrawOver()而不是onChildDraw()onChildDraw()用于绘制背景,onChildDrawOver()用于绘制前景,试试这些代码:

    @Override
    public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
        super.onChildDrawOver(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
    
        if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
            View itemView = viewHolder.itemView;
            c.save();
            c.clipRect(itemView.getLeft() + dX, itemView.getTop() + dY, itemView.getRight() + dX, itemView.getBottom() + dY);
            c.translate(itemView.getLeft() + dX, itemView.getTop() + dY);
    
            // draw the frame
            c.drawColor(0x88888888);
    
            c.restore();
        }
    }
    

    【讨论】:

    • 正如您在我的示例中看到的那样,框架在视图下方绘制,因此我不需要使用 onChildDrawOver()。当我尝试您的代码时,灰色框架仍然存在,但视图被 onChildDrawOver() 的灰色着色
    • 我还是不明白你图片中的灰框是什么。你是说对话框下的阴影吗?或者你想让视图更亮
    • 我的例子是代表实际图片,不是我想要实现的。上对话框 - 是正常状态,下对话框 - 视图处于拖动状态。在下方对话框的左侧,您可以看到一小部分椭圆灰色描边——这就是我所说的灰色框架,我想去掉它
    【解决方案3】:

    高亮由 ItemTouchHelper.onChildDraw 添加 -> ItemTouchUIUtilImpl.onDraw
    覆盖它对我有用

    //ItemTouchUIUtilImpl.onDraw
    public void onDraw(Canvas c, RecyclerView recyclerView, View view, float dX, float dY,
            int actionState, boolean isCurrentlyActive) {
        if (Build.VERSION.SDK_INT >= 21) {
            if (isCurrentlyActive) {
                Object originalElevation = view.getTag(R.id.item_touch_helper_previous_elevation);
                if (originalElevation == null) {
                    originalElevation = ViewCompat.getElevation(view);
                    float newElevation = 1f + findMaxElevation(recyclerView, view);
                    ViewCompat.setElevation(view, newElevation);
                    view.setTag(R.id.item_touch_helper_previous_elevation, originalElevation);
                }
            }
        }
    
        view.setTranslationX(dX);
        view.setTranslationY(dY);
    }
    
    
    //subclass of ItemTouchHelper.Callback
    override fun onChildDraw(
        c: Canvas,
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        dX: Float,
        dY: Float,
        actionState: Int,
        isCurrentlyActive: Boolean
    ) {
        viewHolder.itemView.setTranslationX(dX)
        viewHolder.itemView.setTranslationY(dY)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多