简体   繁体   English

如何在android4.0中使视图接受放置事件?

[英]How to make a view accept drop event in android4.0?

In my app I want to design a view group. 在我的应用中,我想设计一个视图组。 If a add some content such as a textview into this view group, the textview can accept DragEvent . 如果将一些内容(例如textview)添加到此视图组,则textview可以接受DragEvent I tried it using the code below 我尝试使用下面的代码

@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;
    }

}`

But functions do not run as I expected. 但是功能不能按我预期的那样运行。 All DragListeners are involked when I long-click one textview, and only "drag started" and "drag end" are printed. 长按一个textview时,所有的DragListener都会被卷入,并且仅显示“拖动开始”和“拖动结束”。 I read the demo in APIDemo, but I want the drag event can be used for a usual widget. 我阅读了APIDemo中的演示,但是我希望drag事件可以用于普通的小部件。 Any advice? 有什么建议吗? THX 谢谢

The reason it's not working is because you didn't respond true when you received ACTION_DRAG_STARTED. 它不起作用的原因是,当您收到ACTION_DRAG_STARTED时,您没有回答true。

if(event.getAction() == DragEvent.ACTION_DRAG_STARTED){
            System.out.println("drag started.");
            return true;
}

Add the return true when you get the started event and you will register to listen for future drag events by that object. 当您获得启动事件时,添加return true,您将注册以侦听该对象将来的拖动事件。

I added an image view in my activity and used to drag and drop in specific position. 我在活动中添加了图像视图,并用于拖放到特定位置。 And set the drag listener to layout. 并将拖动侦听器设置为布局。

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;
    }
});



}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM