在我的应用中,我想设计一个视图组。如果将一些内容(例如textview)添加到此视图组中,则textview可以接受DragEvent。 我尝试使用下面的代码
@Override
public void addView(View child) {
super.addView(child);
child.setOnDragListener(new ViewDragger());
child.setOnLongClickListener(new DragStarter()) ;
}
class DragStarter implements OnLongClickListener{
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence) v.getTag());
ClipData dragData = new ClipData((CharSequence) v.getTag(),new String[]{"*/*"},item);
View.DragShadowBuilder builder = new View.DragShadowBuilder(v);
boolean started = v.startDrag(dragData, builder, v , 0) ;
System.out.println("start drag " + started+" " + v );
return false;
}
}
class ViewDragger implements OnDragListener{
@Override
public boolean onDrag(View v, DragEvent event) {
if(event.getAction() == DragEvent.ACTION_DRAG_ENDED){
System.out.println("drag end");
}
if(event.getAction() == DragEvent.ACTION_DRAG_ENTERED){
System.out.println("drag entered.");
}
if(event.getAction() == DragEvent.ACTION_DRAG_EXITED){
System.out.println("drag existed.");
}
if(event.getAction() == DragEvent.ACTION_DRAG_LOCATION){
System.out.println("drag location");
}
if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){
System.out.println("drag started.");
}
if(event.getAction() == DragEvent.ACTION_DROP){
System.out.println("action drop");
return true ;
}
System.out.println("view-->" + v);
return false;
}
}`
但是功能没有像我预期的那样运行。当我长按一个文本视图时,所有DragListeners都被驱散,只打印“拖动开始”和“拖动结束”。我在APIDemo中阅读了演示,但我希望拖动事件可以用于通常的小部件。有什么建议? THX
答案 0 :(得分:4)
它不起作用的原因是因为当你收到ACTION_DRAG_STARTED时你没有回复。
if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){
System.out.println("drag started.");
return true;
}
当您获得已启动的事件时,添加返回true,您将注册以侦听该对象的未来拖动事件。
答案 1 :(得分:1)
我在活动中添加了一个图片视图,用于拖放特定位置。 并将拖动侦听器设置为布局。
public class MainActivity extends Activity
{
private ImageView image;
private AbsoluteLayout my;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
my=(AbsoluteLayout)findViewById(R.id.my);
image =(ImageView)findViewById(R.id.imageView1);
my.setOnDragListener(new View.OnDragListener()
{
@Override
public boolean onDrag(View v, DragEvent event) {
if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){
System.out.println("drag started.");
return true;
}
if(event.getAction()==DragEvent.ACTION_DROP)
{
image.setX(event.getX());
image.setY(event.getY());
System.out.println("DROP ENTERED");
return true;
}
else
return false;
}
});
image.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
View.DragShadowBuilder bu=new View.DragShadowBuilder(v);
ClipData clp=ClipData.newPlainText("", "");
v.startDrag(clp,bu,(ImageView)v,0);
return true;
}
else
return false;
}
});
}
}