Android视图隐藏,拖动
我想要实现的应该很容易,但我无法找到它的任何诉求。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只设置所有的按钮,但不是我实际拖动的按钮?
也许还有另一种方法没有setVisibility
和DragShadowBuilder
?
编辑:
在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;
}
}
}
}
为什么不在触摸释放时设置视图的可见性? 对于这一点,你只需要修改你的代码是这样的:
@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;
}
}
之所以event.getLocalState()
回报null
是因为你忘了你传递视图作为本地状态参数,同时呼吁startDrag
方法。
你应该有
v.startDrag(null, new DragShadowBuilder(v), v, 0);
,而不是
v.startDrag(null, new DragShadowBuilder(v), null, 0);
现在,您将能够检索您的视图,并恢复其知名度;)
为我工作..保存我 – 2016-09-21 14:09:59
我将我的代码更改为第一个'v.startDrag(null,new DragShadowBuilder(v),v,0);'。但仍然getLocalState()返回null。 – 2017-01-05 09:36:01
'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
即使你的代码是正确的,这是行不通的。当调用'startDrag'时,会收到一个'ACTION_CANCEL'事件,并且不会收到更多的'MotionEvents'。 – Project 2016-08-19 18:02:35