2013-03-14 2 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 (и дать ip на DragListener), который дал мне координаты на контейнере, и точные результаты были получены при перетаскивании, но когда я отбросил представление, оно исчезло. Вот 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;