【问题标题】:how to use correct dragging of a view on android如何在android上正确拖动视图
【发布时间】:2011-12-15 02:59:18
【问题描述】:

关于如何在android上使用拖拽views似乎有很多解决方案。

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

一个已知的解决方案是有一个 framelayout ,并且视图只是在使用 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 但是,我不确定如何将它用于复杂的视图。

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

请帮助我。

【问题讨论】:

  • @Trevor Page : 你认为有没有一种两全其美的解决方案:不需要扩展和覆盖任何方法并且不限于拖动视图的位置?

标签: android imageview drag android-framelayout layoutparams


【解决方案1】:

这里有一个简单的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;
      }
  });

【讨论】:

  • 使用此代码,动画似乎不能一遍又一遍地使用。如何重置布局参数?
  • @shkschneider 为了改变布局参数,你做我做的 - 获取当前的,改变它们的值,然后再次使用 setLayoutParams。无论如何,对于 layoutParams 上的动画,你可以使用我制作的这个技巧:stackoverflow.com/questions/19519921/…
【解决方案2】:

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

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

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

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

【讨论】:

  • 我找到了解决方案:只需将底部和右边距设置为您拖动的 imageView 的大小(相应的高度和宽度)的两倍的负值。这是一种 hacky 方式,但效果很好。
  • 如何只垂直拖动而不是整个区域
猜你喜欢
  • 2022-08-17
  • 2015-10-10
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多