【问题标题】:Trying to move an ImageView in a touch event via setLayoutParams, imageview is not moving尝试通过 setLayoutParams 在触摸事件中移动 ImageView,imageview 没有移动
【发布时间】:2012-05-10 08:03:41
【问题描述】:

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

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

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

    现在完美运行。

    【讨论】:

      【解决方案2】:

      我相信您想设置顶部和左侧填充。请参阅以下问题,它比我能更好地解释它。 Difference between a View's Padding and Margin

      【讨论】:

      • 我认为更改填充确实有效,但我觉得这有点奇怪。要通过更改填充来移动它,我必须让 imageview 填满整个屏幕,而不是仅仅移动 imageview。这可能是一个解决方案,但我有点想移动视图。
      • 在尝试找出折旧绝对布局的替代方案时,我进行了大量搜索。普遍的共识是使用框架布局并使用填充设置位置。如果有人有更好的方法,我很想听听。
      【解决方案3】:

      我认为:

      iv.setLayoutParams(params);
      

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

      您也许可以通过iv.setX() 设置ImageView 的位置; iv.setY();

      【讨论】:

      • 不幸的是 setX 和 setY 仅在 API 11+ 上可用,试图针对 API 10 (2.3)
      【解决方案4】:

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

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

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

      问题没有出现在第 14 或第 17 关。

      添加上述代码可以在所有 android 级别上实现所需的行为...谢谢 Tim。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 2017-07-02
        • 2013-11-01
        • 2014-12-16
        • 1970-01-01
        • 2014-07-31
        • 2020-09-04
        相关资源
        最近更新 更多