自定义拖放

时间:2016-01-27 22:52:56

标签: android drag-and-drop android-linearlayout

我是一个初学者的android develpoer,我想要建立一个小型的土壤游戏。 为了拖动卡我实现了一个自定义视图组,这是一个“DragContainer”从这里的一个问题。 我的问题是,当我拖动线性布局。我的线性布局持有卡片 带边距(重叠卡片)但是当我开始拖动时,拖动的“阴影”是我没有边距的布局。 这是一个例子

this is the start of the activity, the left is a linear layout with two children and also the right

当我开始拖动时,这就是我所看到的

as you can see the dragged "shadow" is bigger(without the - margin)

这是自定义拖动容器的代码(只有重要的东西):

    public boolean startDragChild(View child, ClipData data,
        Object myLocalState, int flags) {
    setDragTarget(child);
    return child.startDrag(data, new EmptyDragShadowBuilder(child),
            myLocalState, flags);
}

private void setDragTarget(View v) {
    target = v;
    onSetDragTarget(v);
}

/**
 * this is similar to the constructor of DragShadowBuilder
 * 
 * @param v
 */
protected void onSetDragTarget(View v) {

}
    @Override
protected void dispatchDraw(Canvas canvas) {

    super.dispatchDraw(canvas);
    if (mOnDrag && target != null) {
        canvas.save();
        drawDragShadow(canvas);
        canvas.restore();
    }
}

protected void drawDragShadow(Canvas canvas) {
    int h = target.getHeight();
    int w = target.getWidth();
    canvas.translate(mDragX - w / 2, mDragY - h / 2);
    target.draw(canvas);
}

2 个答案:

答案 0 :(得分:1)

我猜akon不需要解释,但我想告诉观众这个问题。 margins内的LinearLayout应该完好无损,因为您移动ViewGroup本身,所以它的孩子的设计不会有任何问题, 代码也可以在Github

上找到
public class DragTestTwoActivity extends AppCompatActivity {

    private LinearLayout source_linearLayout;
    private LinearLayout destination_linearLayout;
    private static final String TAG = "DragTestTwoActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drag_test_two);

        initializeUI();
    }

    private void initializeUI() {

        source_linearLayout = (LinearLayout) findViewById(R.id.DragTestTwoActivity_Source_LinearLayout);
        destination_linearLayout = (LinearLayout) findViewById(R.id.DragTestActivityActivity_Destination_LinearLayout);

//        source_linearLayout.setOnDragListener(new MyDragListener());
        destination_linearLayout.setOnDragListener(new MyDragListener());

        source_linearLayout.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(source_linearLayout);
                source_linearLayout.startDrag(data, shadowBuilder, source_linearLayout, 0);
                return true;
            }
        });
    }

    private class MyDragListener implements View.OnDragListener {


        @Override
        public boolean onDrag(View v, DragEvent event) {

            switch (event.getAction()) {

                case DragEvent.ACTION_DRAG_STARTED:
                    Log.d(TAG, "Drag has started");
                    break;
                case DragEvent.ACTION_DRAG_ENDED:
                    Log.d(TAG, "Drag has ended");
                    v.setVisibility(View.VISIBLE);
                    break;
                case DragEvent.ACTION_DRAG_ENTERED:
                    Log.d(TAG, "Drag has entered");
                    break;
                case DragEvent.ACTION_DRAG_LOCATION:
                    Log.d(TAG, "Drag location");
                    break;
                case DragEvent.ACTION_DROP:
                    Log.d(TAG, "Drag has dropped");
                    View source_linear_Layout = (LinearLayout) event.getLocalState();
                    LinearLayout view = (LinearLayout) source_linear_Layout.getParent();
                    view.removeView(source_linear_Layout); // This will remove the imageView where it was

                    LinearLayout linearLayout = (LinearLayout) v;
                    if (v.getId() == R.id.DragTestActivityActivity_Source_LinearLayout) {
                        Log.d(TAG, "This is a source location");

                    } else if (v.getId() == R.id.DragTestActivityActivity_Destination_LinearLayout) {
                        Log.d(TAG, "This is a destination");

                    }
                    linearLayout.addView(source_linear_Layout); // this will add the ImageView to the new location where it was dropped.
                    source_linear_Layout.setVisibility(View.VISIBLE);


                    break;
                case DragEvent.ACTION_DRAG_EXITED:
                    Log.d(TAG, "Drag has exited");
                    break;
            }

            return true;
        }


    }
}
  

activity_drag_test_two.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="activities.list.first.DragTestTwoActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:padding="4sp">


        <LinearLayout

            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="4dp"
            android:layout_weight="0.5"
            android:background="#ABABAB"
            android:orientation="vertical"
            android:padding="4dp">

            <LinearLayout
                android:id="@+id/DragTestTwoActivity_Source_LinearLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <ImageView
                    android:id="@+id/DragTestTwoActivity_imageView"
                    android:layout_width="wrap_content"
                    android:layout_height="100dp"
                    android:layout_margin="4dp"
                    android:scaleType="centerInside"
                    android:src="@drawable/gohan" />

                <ImageView
                    android:id="@+id/DragTestTwoActivity_imageView2"
                    android:layout_width="wrap_content"
                    android:layout_height="100dp"
                    android:layout_margin="4dp"
                    android:scaleType="centerInside"
                    android:src="@drawable/goku" />
            </LinearLayout>


        </LinearLayout>

        <LinearLayout
            android:id="@+id/DragTestActivityActivity_Destination_LinearLayout"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_margin="4dp"
            android:layout_weight="0.5"
            android:background="#CACACB"
            android:orientation="vertical"
            android:padding="4dp">

        </LinearLayout>


    </LinearLayout>

</LinearLayout>
  

输出   这就是它的样子......

enter image description here

答案 1 :(得分:0)

当然,您可以为此目的使用标准视图,但这是不合理的。最好使用GLSurfaceView(或者如果您了解OpenGL RewriteEngine on RewriteRule ^/$ /cDE [PT] )。