我在全屏FrameLayout中有一个小的ImageView,我想将其设置为当我触摸FrameLayout时,图像视图移动到该位置。
我已经阅读了我可以找到的有关移动 ImageView 的所有其他 SO 问题,但我还没有看到为什么我的解决方案不起作用。
在扩展框架布局的自定义视图中:
@Override
public boolean onInterceptTouchEvent(MotionEvent event){
if(event.getActionMasked() == MotionEvent.ACTION_DOWN){
ImageView iv = (ImageView) this.findViewById(R.id.draggedImage);
FrameLayout.LayoutParams params = (LayoutParams) iv.getLayoutParams();
params.leftMargin = (int) event.getX();
params.bottomMargin = (int) event.getY();
iv.setLayoutParams(params);
iv.invalidate();
invalidate();
}
return true;
}
我已经更改了布局参数边距以反映新的触摸位置,并使图像视图和框架布局无效(不确定我应该执行其中哪一个),但 imageView 不会移动(只是始终位于框架的左上角)。
我还验证了当我触摸屏幕时正在调用此方法,并且参数被设置为合理的 X 和 Y 值。
我的布局:
<CustomFrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<!-- some other unrelated views -->
<ImageView
android:id="@+id/draggedImage"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/pause" />
</CustomFrameLayout>
编辑:应该提到我正在尝试针对 API 级别 10,所以我无法使用任何 Honeycomb 视图方向的优点:(
通过反复试验和搜索发现我错过了这个电话:
params.gravity = Gravity.LEFT | Gravity.BOTTOM;
最初,重力只有-1,所以边际没有影响,因为它不知道它应该从哪一边开始边距。添加重力会给它一个锚定的一侧,以便它可以按边距中的量移出。
现在工作完美。
我相信你想设置顶部和左侧填充。 请参阅以下问题,它比我更好地解释了它。视图填充和边距之间的区别<</p>
我认为:
iv.setLayoutParams(params);
只是将参数设置为iv的布局,即FrameLayout
本身。
您也许可以通过iv.setX()
设置ImageView
的位置; iv.setY()
;
我找到了蒂姆的解决方案:
参数.重力 = 重力.左 |重力底部;
要更改视图的边距,只有在 Android 级别为 10 或更低的设备上运行时才有必要!
问题没有出现在第 14 层或第 17 层。
添加上面的代码在所有安卓级别上都给出了所需的行为......谢谢蒂姆。