6

似乎有很多关于如何在 android 上使用拖动视图的解决方案。

但是,它们要么太慢,要么有问题。

一个已知的解决方案是有一个框架布局,并且视图只是在使用 OnTouchListener 移动时更改其 layoutParams,如下所述: http ://www.anddev.org/novice-tutorials-f8/android-drag-and-drop -of-normal-views-not-bitmaps-t13404.html 但是,如果视图是 imageView ,当到达 framelayout 的最右边(或最底部)时,图像会缩小。

另一种可能的解决方案是使用画布来显示拖动的内容,如下所述: http ://www.anddev.org/basic_drag_and_drop-t3095.html 但是,我不确定如何将它用于复杂的视图。

有谁知道一个好的解决方案,让拖动视图的大小保持不变,无论它在其容器中的什么位置?

请帮我 。

4

2 回答 2

17

这是一个简单的imageView拖动的完整解决方案:

findViewById(R.id.imageView).setOnTouchListener(new OnTouchListener()
  {
    int prevX,prevY;

    @Override
    public boolean onTouch(final View v,final MotionEvent event)
      {
      final FrameLayout.LayoutParams par=(FrameLayout.LayoutParams)v.getLayoutParams();
      switch(event.getAction())
        {
        case MotionEvent.ACTION_MOVE:
          {
          par.topMargin+=(int)event.getRawY()-prevY;
          prevY=(int)event.getRawY();
          par.leftMargin+=(int)event.getRawX()-prevX;
          prevX=(int)event.getRawX();
          v.setLayoutParams(par);
          return true;
          }
        case MotionEvent.ACTION_UP:
          {
          par.topMargin+=(int)event.getRawY()-prevY;
          par.leftMargin+=(int)event.getRawX()-prevX;
          v.setLayoutParams(par);
          return true;
          }
        case MotionEvent.ACTION_DOWN:
          {
          prevX=(int)event.getRawX();
          prevY=(int)event.getRawY();
          par.bottomMargin=-2*v.getHeight();
          par.rightMargin=-2*v.getWidth();
          v.setLayoutParams(par);
          return true;
          }
        }
      return false;
      }
  });
于 2013-09-14T21:16:39.177 回答
2

我在当前项目中使用拖放,其中各种Views 被放置在 aRelativeLayout根据LayoutParams应用于它们的位置。像您一样,我发现视图在到达ViewGroup容器的右侧或底部时会“缩小”。这可能很明显会发生,真的,考虑到在测量和布局阶段,系统将确定给定View的尺寸突然必须比你实际希望的尺寸小得多,如果它仍然能够当放置在极端附近时以适应父级。

我目前为解决这个问题所做的一个非常简单的解决方案是简单地将我的ViewGroup相对于屏幕尺寸过大。

此外,您可能决定实际上不希望Views 部分出现在屏幕外,在这种情况下,您将使用一些程序逻辑来防止设置View对象的边距,以便View允许 s 离开父容器的边界。

另一种解决方案可能是覆盖onMeasure()或类似以强制子级View强制大于父级认为可用的大小 - 如果可能的话 - 强制将视图放置在所需的大小,重叠边缘。不过,这只是我脑海中的一个想法,还没有调查过。

于 2011-10-25T17:42:20.893 回答