【问题标题】:How to get precise coordinates while dragging in android?在android中拖动时如何获得精确的坐标?
【发布时间】:2013-03-14 11:05:27
【问题描述】:

晚上好

我正在尝试在可拖动视图上使用 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;


      }
    }

谁能告诉我我该怎么做?

【问题讨论】:

    标签: android android-layout android-widget


    【解决方案1】:

    你必须这样做:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-24
      • 2020-07-30
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多