尝试通过setLayoutParams在触摸事件中移动ImageView时,imageview不会移动

时间:2012-05-10 08:03:42

标签: android

我在全屏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视图方向的优点:(

4 个答案:

答案 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。