如何在android上正确拖动视图

如何在android上正确拖动视图,android,imageview,drag,android-framelayout,layoutparams,Android,Imageview,Drag,Android Framelayout,Layoutparams,在android上,似乎有很多关于如何使用视图拖动的解决方案 但是,它们要么太慢,要么太多 一种已知的解决方案是使用framelayout,视图在使用OnTouchListener移动时只需更改其layoutParams,如下所述: 但是,如果视图是imageView,当到达framelayout的最右侧(或最底部)时,图像会收缩 另一种可能的解决方案是使用画布来显示拖动的内容,如下所述: 但是,我不知道如何在复杂视图中使用它 有没有人知道一个好的解决方案,让被拖动视图的大小保持不变,不管它在容

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

但是,它们要么太慢,要么太多

一种已知的解决方案是使用framelayout,视图在使用OnTouchListener移动时只需更改其layoutParams,如下所述: 但是,如果视图是imageView,当到达framelayout的最右侧(或最底部)时,图像会收缩

另一种可能的解决方案是使用画布来显示拖动的内容,如下所述: 但是,我不知道如何在复杂视图中使用它

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


请帮帮我

我在当前项目中使用拖放,其中各种
视图
根据应用于它们的
布局参数
放置在
相对视图
中。与您一样,我发现视图在到达
ViewGroup
容器的右侧或底部时会“收缩”。考虑到在测量和布局阶段,系统将确定给定的
视图
突然必须具有比您实际希望的小得多的尺寸,如果将其放置在极端附近时仍然能够适应父视图,那么这种情况很可能会发生

目前我所做的一个非常简单的解决方案是,相对于屏幕大小,简单地增大我的
视图组的大小

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


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

下面是一个简单的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上的动画,可以使用我制作的以下技巧: