拖动时Android视图不可见

时间:2015-04-02 14:42:48

标签: android drag-and-drop

我想要实现的目标应该非常简单,但我无法找到任何解决方案。

我想要一个可拖动的按钮,在拖动时应该是不可见的 当用户开始拖动此按钮时,我只想显示按钮的拖影。

到目前为止,我有onTouch

OnTouchListener函数的多重按钮
public boolean onTouch(View v, MotionEvent event) {
    v.setVisibility(View.INVISIBLE);
    v.startDrag(null, new DragShadowBuilder(v), null, 0);
    return true;
}

现在我需要另一种方法,我可以再次将按钮设置为可见 我已经尝试了OnDragListener,但是这个Listener只设置了所有按钮,而不是我实际拖动的按钮?

也许还有其他方法没有setVisibilityDragShadowBuilder

修改

在我发现的this教程中,我可以在event.getlocalstate()中使用OnDragListener来获取被拖动的视图。 在那里我可以再次设置我的视图。 问题是,此方法始终返回null

编辑2:

我创建了一个新的简单项目,其中只包含三个按钮和一个可以删除按钮的textview。我使用了教程中的代码,但它仍然无效:

public class MainActivity extends Activity {



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

    Button button1 = (Button) findViewById(R.id.button);
    Button button2 = (Button) findViewById(R.id.button2);
    Button button3 = (Button) findViewById(R.id.button3);

    button1.setOnTouchListener(new MyOnTouchListener());
    button2.setOnTouchListener(new MyOnTouchListener());
    button3.setOnTouchListener(new MyOnTouchListener());

    TextView dropArea = (TextView) findViewById(R.id.textView);
    dropArea.setOnDragListener(new MyOnDragListener());


}

private class MyOnDragListener implements View.OnDragListener {

    @Override
    public boolean onDrag(View v, DragEvent event) {
        switch (event.getAction()){
            case DragEvent.ACTION_DROP:{
                View view = (View) event.getLocalState();
                if (view == null){
                    Log.e("SORRY", "NO VIEW!");
                }else{
                    view.setVisibility(View.VISIBLE);
                }
            }
        }
        return true;
    }
}

private class MyOnTouchListener implements View.OnTouchListener {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            v.startDrag(null, new View.DragShadowBuilder(v), null, 0);
            v.setVisibility(View.INVISIBLE);
            return true;
        }else{
            return false;
        }
    }
}
}

3 个答案:

答案 0 :(得分:4)

event.getLocalState()返回null的原因是您忘记在调用startDrag方法时将视图作为本地状态参数传递。

你应该

v.startDrag(null, new DragShadowBuilder(v), v, 0);

而不是

v.startDrag(null, new DragShadowBuilder(v), null, 0);

您现在可以检索视图并恢复其可见性;)

答案 1 :(得分:0)

为什么不在触摸释放时设置视图的可见性? 为此,您只需要以这种方式修改代码:

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        v.startDrag(null, new View.DragShadowBuilder(v), null, 0);
        v.setVisibility(View.INVISIBLE);
        return true;
    }
    else if (event.getAction() == MotionEvent.ACTION_DOWN) {
      /* ENTER YOUR CODE HERE */
      /* For example : 
         button.setVisible(View.VISIBLE);
      */
    }
    else{
        return false;
    }
}

答案 2 :(得分:0)

2项需要更改:

  1. 检查MotionEvent.ACTION_DOWN的条件
  2. 如果(Build.VERSION.SDK_INT> = Build.VERSION_CODES.N){

         if (event.getAction() == MotionEvent.ACTION_DOWN) {
            ClipData.Item item = new ClipData.Item((CharSequence) view.getTag());
            String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
            ClipData data = new ClipData(view.getTag().toString(), mimeTypes, item);
            DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
    
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                view.startDragAndDrop(data, shadowBuilder, view, 0);
            } else {
                view.startDrag(data, //data to be dragged
                        shadowBuilder, //drag shadow
                        view, //local data about the drag and drop operation
                        0);  //no needed flags
            }
    
            view.setVisibility(View.INVISIBLE);
            return true;
        }else {
            return false;
        }