2013-03-14 66 views
2

晚上好如何在android中拖動時獲得精確座標?

我想實現拖動和拖放使用onTouchListener上的阻力區視圖中拖動視圖和onDragListener如下:

這裏是MyDragListener ..

class MyDragListener implements OnDragListener { 
    Drawable enterShape = getResources().getDrawable(R.drawable.ic_launcher); 
    Drawable normalShape = getResources().getDrawable(R.drawable.ic_launcher); 

    @Override 
    public boolean onDrag(View v, DragEvent event) { 
    int action = event.getAction(); 
    switch (event.getAction()) { 

    /*Some irrelevant cases*/ 

    case DragEvent.ACTION_DROP: 
     // Dropped, reassign View to ViewGroup 
     View view = (View) event.getLocalState(); 
     ViewGroup owner = (ViewGroup) view.getParent(); 
     owner.removeView(view); 
     FrameLayout container; 
     container = (FrameLayout) v; 
    container.addView(view); 
    view.setX(event.getX()); 
    view.setY(event.getY()); 
     view.setVisibility(View.VISIBLE); 
     break; 
     default: 
     break; 
    } 
    return true; 
    } 
} 

而且我分配此監聽器的阻力區是像這樣在我的例子 一個的FrameLayout:

FrameLayout f= (FrameLayout) findViewById(id.FrameLayout); 

    f.setOnDragListener(new MyDragListener()); 

這裏是佈局:

<FrameLayout 
android:id="@+id/FrameLayout" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_weight="0.8"> 

<ImageView 
    android:contentDescription="This is the main panel of the program" 
    android:id="@+id/imageView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/blank" 
    android:isScrollContainer="true" 
    /> 
<Button 
    android:id="@+id/DraggableButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Drag me -_-" 
    /> 

現在的問題是,我只能得到原X,Y座標,並且沒有產生精確的結果....

我試圖用onTouchListener(並給DragListener上的ip)來處理這個問題,它給了我容器上的座標,並且在拖拽時獲得了精確的結果,但是當我放棄視圖時它就消失了。 這裏是MyTouchListener代碼:

private final class MyTouchListener implements OnTouchListener { 
    @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { 
      ClipData data = ClipData.newPlainText("", ""); 
      DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view); 
      view.startDrag(data, shadowBuilder, view, 0); 
      view.setVisibility(View.INVISIBLE); 
      return true; 
     } 
     else 
      if(motionEvent.getAction()==MotionEvent.ACTION_UP) 
      { 
        // View view = (View) motionEvent.getLocalState(); 

        view.setX(motionEvent.getX()); 
        view.setY(motionEvent.getY()); 


        view.setVisibility(View.VISIBLE); 
       return true; 
       } 
     return false; 


     } 
    } 

任何人能告訴我什麼是我該怎麼辦?

回答

0

你必須做這樣的事情:

case DragEvent.ACTION_DROP: 
    // Dropped, reassign View to ViewGroup 
    View view = (View) event.getLocalState(); 
    ViewGroup owner = (ViewGroup) view.getParent(); 
    owner.removeView(view); 
    FrameLayout container; 
    container = (FrameLayout) v; 
    float y = event.getY() - view.getHeight()/2; 

    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(view.getWidth(), view.getHeight()); 
    layoutParams.setMargins(0, (int)y, 0, 0); 
    view.setLayoutParams(layoutParams); 

    container.addView(view); 
    view.setVisibility(View.VISIBLE); 
    break; 
相關問題