我在全屏FrameLayout中有一个小的ImageView,我想设置它,当我触摸FrameLayout时,imageview移动到那个位置。
我已经阅读了有关移动ImageView的所有其他SO问题,但我还没有看到为什么我的解决方案还没有工作。
在扩展FrameLayout的自定义视图中:
@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;
}
我已经更改了layoutparams边距以反映新的触摸位置,并使imageview和framelayout无效(不确定我应该做哪些),但是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视图方向的优点:(
答案 0 :(得分:3)
通过反复试验和搜索发现我错过了这个电话:
params.gravity = Gravity.LEFT | Gravity.BOTTOM;
最初引力只有-1,所以边距没有影响,因为它不知道它应该以哪一边为基础。添加重力会给它一个锚定的一侧,以便它可以通过边距中的数量移出。
现在完美运作。
答案 1 :(得分:1)
我相信您要设置顶部和左侧填充。请参阅以下问题,该问题解释得比我更好。 Difference between a View's Padding and Margin
答案 2 :(得分:1)
我认为:
iv.setLayoutParams(params);
只是将参数设置为iv的布局,即FrameLayout
本身。
您可以按ImageView
设置iv.setX()
的位置; iv.setY()
;
答案 3 :(得分:0)
我找到了蒂姆的解决方案:
params.gravity = Gravity.LEFT | Gravity.BOTTOM; 强>
更改视图的边距,只有在Android级别为10或更低的设备上运行时才有必要!
这个问题没有出现在14或17级。
添加上面的代码在所有Android级别上都给出了所需的行为......谢谢Tim。