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