Android在拖放,Drop无法正常工作

时间:2016-02-29 07:28:39

标签: android

这里我放了我的代码,当我放弃我的视图(ImageView)它是隐形的请帮帮我

public class MainActivity extends ActionBarActivity {

    ImageView ivfirst;
    private android.widget.RelativeLayout.LayoutParams layoutParams;

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

        ivfirst = (ImageView) findViewById(R.id.imgView);

        ivfirst.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                ClipData.Item item = new ClipData.Item((CharSequence) v
                        .getTag());
                String[] mimeTypes = { ClipDescription.MIMETYPE_TEXT_PLAIN };

                ClipData dragData = new ClipData(v.getTag().toString(),
                        mimeTypes, item);
                View.DragShadowBuilder myShadow = new View.DragShadowBuilder(
                        ivfirst);

                v.startDrag(dragData, myShadow, null, 0);
                return true;
            }
        });


          ivfirst.setOnDragListener(new View.OnDragListener() {
             @Override
             public boolean onDrag(View v, DragEvent event) {
                switch(event.getAction())
                {
                   case DragEvent.ACTION_DRAG_STARTED:
                   layoutParams = (RelativeLayout.LayoutParams)v.getLayoutParams();

                   // Do nothing
                   break;

                   case DragEvent.ACTION_DRAG_ENTERED:
                   int x_cord = (int) event.getX();
                   int y_cord = (int) event.getY();
                   break;

                   case DragEvent.ACTION_DRAG_EXITED :
                    x_cord = (int) event.getX();
                   y_cord = (int) event.getY();
                   layoutParams.leftMargin = x_cord;
                   layoutParams.topMargin = y_cord;
                   v.setLayoutParams(layoutParams);
                   break;

                   case DragEvent.ACTION_DRAG_LOCATION  :
                   x_cord = (int) event.getX();
                   y_cord = (int) event.getY();
                   break;

                   case DragEvent.ACTION_DRAG_ENDED   :

                   // Do nothing
                   break;

                   case DragEvent.ACTION_DROP:

                   // Do nothing
                   break;
                   default: break;
                }
                return true;
             }
          });
        ivfirst.setOnTouchListener(new View.OnTouchListener() {
            @SuppressLint("ClickableViewAccessibility")
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    ClipData data = ClipData.newPlainText("", "");
                    View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
                            ivfirst);

                    ivfirst.startDrag(data, shadowBuilder, ivfirst, 0);
                    ivfirst.setVisibility(View.INVISIBLE);

                    return true;
                } else {
                    return false;
                }
            }
        });

    }

}

当我运行程序时它正常工作但是丢弃不起作用, 请告诉我我错在哪里

2 个答案:

答案 0 :(得分:0)

这是因为你在ACTION_DROP中没有做任何事 ACTION_DRAG_EXITED的{​​{3}}:

  

getAction()返回的操作常量:表示用户已将拖动阴影移动到视图的边界框外。

您删除时已为已拖动的View定义了任何行为。

答案 1 :(得分:0)

我研究了Android Launcher代码,看看它们是如何拖放的。我真的很喜欢他们的对象模型。他们做了什么,并且你可能考虑好处,是将处理拖放的责任移到ViewGroup中,其中所有可拖动的视图都在其中。触摸事件在那里而不是在您的视图中处理。

两个关键类:

DragLayer - 实现一个自定义ViewGroup,它可以协调屏幕上视图的移动。 Launcher DragLayer是FrameLayout的子类。

DragController - 此对象是执行大部分工作以支持拖放的控制器。

他们做的另一件事是在你拖动拖动的对象之前不移动实际视图。它看起来并不那样,因为在屏幕上你会看到一个根据手指(或指针)移动的视图构造的位图。