RecyclerView 拖动高亮
RecyclerView drag highlight
如何change/remove项目拖动高亮?我正在使用 ItemTouchHelper,我知道我需要用 onChildDraw 方法做一些事情,但我不想覆盖整个 ACTION_STATE_DRAG事件,只需要影响拖动item时出现的那个灰框
我有:
gray frame
编辑: 我注意到框架没有出现在 Lollipop 之前的设备上,所以也许我只需要设置一些主题强调色,但我找不到它的正确选择器(尝试了 colorControlActivated 和 colorControlHighlight)
覆盖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();
}
}
我解决了我的问题。那个灰色框只是一个元素的高度,即表示拖动的简单阴影(当你拿起一个要拖动的元素时,它会变得高于其他元素,所以它有一个阴影;我是这样想的并且是正确的)。所以我设置了 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);
}
}
或者最好在您的自定义适配器中执行此操作
亮点由 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)
}
如何change/remove项目拖动高亮?我正在使用 ItemTouchHelper,我知道我需要用 onChildDraw 方法做一些事情,但我不想覆盖整个 ACTION_STATE_DRAG事件,只需要影响拖动item时出现的那个灰框
我有: gray frame
编辑: 我注意到框架没有出现在 Lollipop 之前的设备上,所以也许我只需要设置一些主题强调色,但我找不到它的正确选择器(尝试了 colorControlActivated 和 colorControlHighlight)
覆盖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();
}
}
我解决了我的问题。那个灰色框只是一个元素的高度,即表示拖动的简单阴影(当你拿起一个要拖动的元素时,它会变得高于其他元素,所以它有一个阴影;我是这样想的并且是正确的)。所以我设置了 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);
}
}
或者最好在您的自定义适配器中执行此操作
亮点由 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)
}