Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改DragShadowBuilder使用的视图的外观_Android_Android Layout_Drag And Drop_Android Support Library - Fatal编程技术网

Android 更改DragShadowBuilder使用的视图的外观

Android 更改DragShadowBuilder使用的视图的外观,android,android-layout,drag-and-drop,android-support-library,Android,Android Layout,Drag And Drop,Android Support Library,我想在recyclerview中实现拖放功能。一切都进行得很顺利,直到我想要自定义被拖动视图的外观(不是拖动事件开始的视图,我想要修改“阴影”并保持原始视图不变) 我试着用正在传递的视图制作位图,但最终结果是原始项和阴影都被修改,原始视图在列表中失去了位置。。。WTF 这是我的密码: public class ImageDragShadowBuilder extends View.DragShadowBuilder { private Bitmap shadow; Linear

我想在recyclerview中实现拖放功能。一切都进行得很顺利,直到我想要自定义被拖动视图的外观(不是拖动事件开始的视图,我想要修改“阴影”并保持原始视图不变)

我试着用正在传递的视图制作位图,但最终结果是原始项和阴影都被修改,原始视图在列表中失去了位置。。。WTF

这是我的密码:

public class ImageDragShadowBuilder extends View.DragShadowBuilder {
    private Bitmap shadow;

    LinearLayout linearLayout;

    private ImageDragShadowBuilder() {
        super();
    }

    public static ImageDragShadowBuilder create(Context context, View view) {
        ImageDragShadowBuilder builder = new ImageDragShadowBuilder();
        builder.linearLayout = (LinearLayout) view.findViewById(R.id.metric_item);
        builder.linearLayout.setBackgroundResource(R.drawable.background_item_dragging);

        builder.shadow = createBitmapFromView(builder.linearLayout);

        return builder;
    }

    public View getLayout() {
        return linearLayout;
    }

    private static Bitmap createBitmapFromView(View v) {
        Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
        v.layout(0, 0, v.getWidth(), v.getHeight());
        v.draw(new Canvas(b));
        return b;
    }

    @Override
    public void onDrawShadow(Canvas canvas) {
        canvas.drawBitmap(shadow, 0, 0, null);
    }

    @Override
    public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
        shadowSize.x = shadow.getWidth();
        shadowSize.y = shadow.getHeight();
        shadowTouchPoint.x = shadowSize.x / 2;
        shadowTouchPoint.y = shadowSize.y / 2;
    }
}

有什么想法吗?我认为有两个问题:

  • 在附加到RecyclerView的视图上设置背景会影响原始项目和阴影
  • 触发布局会更改项目的子项位置
基本上,您可以使用原始视图,但不应修改它。稍微修改一下的阴影生成器版本可能是:

public static ImageDragShadowBuilder create(Context context, View view) {
    ImageDragShadowBuilder builder = new ImageDragShadowBuilder();
    builder.linearLayout = (LinearLayout) view.findViewById(R.id.metric_item);

    // do not change the original view
    // we will draw the background directly later
    // builder.linearLayout.setBackgroundResource(R.drawable.background_item_dragging);

    builder.shadow = createBitmapFromView(builder.linearLayout);

    return builder;
}

private static Bitmap createBitmapFromView(View v) {
    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);

    // do not change the original view
    // v.layout(0, 0, v.getWidth(), v.getHeight());

    Canvas c = new Canvas(b);

    // draw the background
    Drawable background = v.getContext().getDrawable(R.drawable.background_item_dragging);
    background.setBounds(0, 0, b.getWidth(), b.getHeight());
    background.draw(c);

    v.draw(c);
    return b;
}

v.getContext().getDrawable()
只能从21开始使用,我只能从16开始使用。还有其他选择吗?我尝试了
ContextCompat.getDrawable(v.getContext()
,ID),但这不会改变背景。这就是说,原来的项目不再移动,所以这是一个良好的开端!更多信息。我怀疑我是因为其他原因,这似乎是因为原始视图已经有了背景!这与我获取可绘制图像的方式无关(无论是21还是16),所以下一个问题是。。。有可能应用效果并保留背景吗???
Context.getDrawable()
只是
Context.getResources().getDrawable(…)
我想重点是:只要不更改视图,你可以在位图中绘制你想要的视图、可绘制的视图或其他东西:你不拥有它,它仍然附着在RecyclerView中