4

我在全屏 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

4 回答 4

3

通过反复试验和搜索发现我错过了这个电话:

params.gravity = Gravity.LEFT | Gravity.BOTTOM;

最初重力只是-1,所以边距没有影响,因为它不知道它应该从哪一侧开始边距。添加重力使其具有锚定的一侧,以便可以将其移出边距中的量。

现在完美运行。

于 2012-05-11T02:56:19.270 回答
1

我相信您想设置顶部和左侧填充。请参阅以下问题,它比我能更好地解释它。视图的填充和边距之间的区别

于 2012-05-10T08:10:01.330 回答
1

我觉得:

iv.setLayoutParams(params);

只是将参数设置为FrameLayout本身的 iv 布局。

您也许可以设置ImageView´s Position by iv.setX(); iv.setY();

于 2012-05-10T08:15:28.210 回答
0

我找到了蒂姆的解决方案:

params.gravity = Gravity.LEFT | 重力.BOTTOM;

要更改视图的边距,只有在 android 级别 10 或更低的设备上运行时才需要!

问题没有出现在 14 或 17 级。

添加上面的代码可以在所有 android 级别上提供所需的行为......谢谢蒂姆。

于 2013-04-24T10:37:15.090 回答