我想要实现的目标应该非常简单,但我无法找到任何解决方案。
我想要一个可拖动的按钮,在拖动时应该是不可见的 当用户开始拖动此按钮时,我只想显示按钮的拖影。
到目前为止,我有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只设置了所有按钮,而不是我实际拖动的按钮?
也许还有其他方法没有setVisibility
和DragShadowBuilder
?
修改
在我发现的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;
}
}
}
}
答案 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项需要更改:
如果(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;
}