android - 更改 DragShadowBuilder 使用的 View 的外观

标签 android android-layout drag-and-drop android-support-library

我想在回收 View 中实现拖放功能。一切都很顺利,直到我想自定义被拖动 View 的外观(不是拖动事件开始的 View ,我想修改“阴影”并保持原始 View 相同)。

我试图从正在传递的 View 中制作位图,但最终结果是原始项目和阴影都被修改并且原始 View 在列表中失去了它的位置......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 的 View 上设置背景会影响原始项目和阴影
  • 触发布局会更改项目的子项位置

基本上你可以使用原始 View ,但你不应该修改它。影子生成器的稍微修改版本可能是:

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

关于android - 更改 DragShadowBuilder 使用的 View 的外观,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51602655/

相关文章:

android - Flutter Firebase Error Null fundtion(FirebaseUser)无法分配给参数,仪表类型 FutureOr <dynamic>

android - 框架布局 : Fill empty space

android - 状态栏和导航栏颜色不会改变

android - 在android :src for ImageView using data binding in Android中设置drawable资源ID

c# - 在没有 Storyboard 的情况下以编程方式创建 float 的可拖动按钮(Xamarin)

java - 将压缩文件从 swing 拖放到 native [更新]

java - 可运行崩溃中的 HTTPPost

java - MainActivity 上的 android.view.InflateException 错误

java - Android Canvas 更新问题

javascript - jQuery UI - 从放置区域拖动项目并将其放回同一放置区域 - 放置事件不会触发