ImageView setMargins不起作用

3

我有一个FrameLayout,里面有两张图片,一张大图填充整个FrameLayout,另一张非常小的图我想要移动它。

我尝试像这样移动小图:xml文件

   <FrameLayout android:id="@+id/layTrackMap"
                      android:layout_width="wrap_content" 
                               android:layout_height="wrap_content"
                               android:visibility="gone">

         <ImageView android:id="@+id/imgTrackMap" 
               android:layout_width="wrap_content" 
               android:layout_height="wrap_content"
               />

         <ImageView android:id="@+id/imgPosition" 
               android:layout_width="wrap_content"
               android:src="@drawable/position" 
               android:layout_height="wrap_content"

               />

         </FrameLayout>   

代码如下:

imgPosition = (ImageView)findViewById(R.id.imgPosition);

    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);

    //Neither this:
    //lp.setMargins(30, 20, 0, 0);

    //Or this
    lp.leftMargin=30;
    lp.topMargin=80;

    imgPosition.setLayoutParams(lp);

这个小图片不能移动。我希望能够在布局中移动这个小图片。

后来编辑: 尝试了几个建议后,我得出结论,更简单的方法是创建一个自定义视图并重写onDraw方法来完成任务。

3个回答

11

你还需要设置重力来使用边距:

lp.gravity = Gravity.LEFT | Gravity.TOP;

由于某种原因,只有像这样在代码中设置重力才能解决我的问题;奇怪的是,在XML布局中设置重力并没有起作用。 - Trevor

3
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
                    FrameLayout.LayoutParams.WRAP_CONTENT, 
                    FrameLayout.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.LEFT | Gravity.TOP;
lp.setMargins(left, top, right, bottom);
imgPosition1.setLayoutParams(lp);  

lp = new FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.WRAP_CONTENT, 
                FrameLayout.LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.LEFT | Gravity.TOP;    
lp.setMargins(left, top, right, bottom);
imgPosition2.setLayoutParams(lp); 

我成功地使用了setMargin,就像普通的setPadding一样。但是,你需要为每个想要设置边距的imageview设置一个新的布局参数。


2

FrameLayout 中的所有元素都固定在左上角,即使设置了边距也无法移动。但是,您可以通过使用填充来获得相同的结果...

imgPosition.setPadding(30, 80, 0, 0);

这在理论上是可行的。但是,如果您想添加背景可绘制对象(例如,以指示所选图像),则会拉伸它。更好的解决方案是使用边距定义LayoutParam对象,并将重力设置为Fede所指示的方式。或者,如果您愿意采用这种方法,可以自定义视图。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接