2015-04-02 97 views
2

我想要实现的应该很容易,但我无法找到它的任何诉求。Android视图隐藏,拖动

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

到目前为止,我有有复式按钮与他们OnTouchListener

public boolean onTouch(View v, MotionEvent event) { 
    v.setVisibility(View.INVISIBLE); 
    v.startDrag(null, new DragShadowBuilder(v), null, 0); 
    return true; 
} 

现在我需要另一种方法,在那里我可以重新设置我的按钮可见这个onTouch功能。
我已经试过了OnDragListener,但是这个Listener只设置所有的按钮,但不是我实际拖动的按钮?

也许还有另一种方法没有setVisibilityDragShadowBuilder

编辑:

this教程中,我发现,我可以在我的OnDragListener使用event.getlocalstate()来获得所beeing拖动查看。 在那里我可以设置我的视图再次可见。 问题是,此方法始终返回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; 
     } 
    } 
} 
} 

回答

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

即使你的代码是正确的,这是行不通的。当调用'startDrag'时,会收到一个'ACTION_CANCEL'事件,并且不会收到更多的'MotionEvents'。 – Project 2016-08-19 18:02:35

2

之所以event.getLocalState()回报null是因为你忘了你传递视图作为本地状态参数,同时呼吁startDrag方法。

你应该有

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

,而不是

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

现在,您将能够检索您的视图,并恢复其知名度;)

+0

为我工作..保存我 – 2016-09-21 14:09:59

+0

我将我的代码更改为第一个'v.startDrag(null,new DragShadowBuilder(v),v,0);'。但仍然getLocalState()返回null。 – 2017-01-05 09:36:01

+0

'ClipData dragData = new ClipData(view.getTag()。toString(),mimeTypes,item); View.DragShadowBuilder myShadow = new View.DragShadowBuilder(view); if(Build.VERSION。SDK_INT> = Build.VERSION_CODES.N){ view.startDragAndDrop(dragData,myShadow,view,0); } else { view.startDrag(dragData,myShadow,view,0); '它工作。 – 2017-01-05 09:39:31