尝试通过 setLayoutParams 在触摸事件中移动 ImageView,imageview 没有移动



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

div class="one_answers">

我认为:

iv.setLayoutParams(params);

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

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

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

参数.重力 = 重力.左 |重力底部;

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

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

添加上面的代码在所有安卓级别上都给出了所需的行为......谢谢蒂姆。

最新更新