2011-12-19 20 views
0

在我的應用程序中,我想設計一個視圖組。如果將某些內容(如文本視圖)添加到此視圖組中,則textview可以接受DragEvent。 我試過用下面如何在android4.0中使視圖接受放置事件?

@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

回答

4

不工作的原因是因爲您在收到ACTION_DRAG_STARTED時沒有回覆正確。

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

當你得到開始的事件時,返回true,你將註冊以偵聽該對象將來的拖動事件。

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



} 
} 
相關問題