如何在Android中动态设置视图的位置?

Aru*_*ole 94 layout android view

如何通过代码更改视图的位置?喜欢改变它的X,Y位置.可能吗?

Per*_*ave 113

对于Honeycomb(API Level 11)以下的任何内容,您都必须使用setLayoutParams(...).

如果你可以限制你的支持蜂窝最多可以使用setX(...),setY(...),setLeft(...),setTop(...),等.

  • 来自setTop()的文档http://developer.android.com/reference/android/view/View.html#setTop%28int%29:`设置此视图相对于其父级的顶部位置.这个方法是由布局系统调用的,一般不应该被调用,因为属性可能随时被布局改变. - 所以也许这不是一个好主意;) (38认同)

Aka*_*shG 43

是的,您可以在Android中动态设置视图的位置.同样,你有一个ImageViewLinearLayout你的XML file.So你可以通过设置它的位置的LayoutParams.但一定要采取LayoutParams根据你的XML file.There采取的布局是不同的LayoutParams,根据拍摄的布局.

以下是要设置的代码:

    LayoutParams layoutParams=new LayoutParams(int width, int height);
    layoutParams.setMargins(int left, int top, int right, int bottom);
    imageView.setLayoutParams(layoutParams);
Run Code Online (Sandbox Code Playgroud)

我希望你能够有所帮助.

  • 还要注意你必须导入android.widget.LinearLayout.LayoutParams; 因为默认值是ViewGroup的LayoutParams (15认同)

Ste*_*ein 27

已经有不同的有效答案,但似乎没有正确建议在哪种情况下使用哪种方法,除了相应的API级别限制:

  • 如果您可以等待布局周期并且父视图组支持MarginLayoutParams(或子类),请设置marginLeft/ marginTop相应.

  • 如果您需要立即和持久地更改位置(例如,对于PopupMenu锚点),请layout(l, t, r, b)使用相同的坐标进行调用.这预示着布局系统稍后会确认的内容.

  • 对于即时(临时)更改(例如动画),请使用setX()/ setY()代替.如果父级大小不依赖于WRAP_CHILDREN,则可以使用setX()/ setY()exclusive.

  • 永远不要使用setLeft()/ setRight()/ setBottom()/ setTop(),见下文.

背景:mLeft/ mTop/ mBottom/ mRight字段从layout()中相应的LayoutParams填充.Android视图布局系统隐式和异步调用布局.因此,设置MarginLayoutParams似乎是永久设置位置的最安全和最干净的方式.但是,在某些情况下,异步布局延迟可能是一个问题,例如,当使用View来渲染光标时,它应该被重新定位并同时用作PopupMenu锚点.在这种情况下,调用layout()对我来说很好.

与存在的问题setLeft()setTop()主要有:

  • 单独调用它们是不够的 - 您还需要调用setRight()setBottom()避免拉伸或缩小视图.

  • 这些方法的实现看起来相对复杂(=做一些工作来解释每个方法导致的视图大小变化)

  • 它们似乎会导致输入字段出现奇怪问题:EditText软数字键盘有时不允许数字

setX()并且setY()在布局系统之外工作,并且相应的值被视为由布局系统确定的左/上/下/右值的附加偏移,相应地移动视图.它们似乎已添加到动画中(无需经过布局循环即可立即生效).


Ben*_*Ben 18

有一个名为NineOldAndroids的库,它允许您使用Honeycomb动画库一直到第一版.

这意味着您可以使用稍微不同的界面定义left,right,translationX/Y.

下面是它的工作原理:

ViewHelper.setTranslationX(view, 50f);
Run Code Online (Sandbox Code Playgroud)

您只需使用ViewHelper类中的静态方法,传递视图以及要将其设置为的值.


bri*_*rns 16

我建议使用 setTranslationXsetTranslationY.我自己只是刚刚开始这个,但这些似乎是移动视图最安全和首选的方式.我想这很大程度上取决于你究竟要做什么,但这对我来说对于2D动画来说效果很好.


Chi*_*ice 12

如果您使用的是HoneyComb Sdk(API Level 11),则可以尝试使用以下方法.

view.setX(float x);
Run Code Online (Sandbox Code Playgroud)

参数x是此视图的可视x位置.

view.setY(float y);
Run Code Online (Sandbox Code Playgroud)

参数y是该视图的视觉y位置.

我希望它对你有所帮助.:)

  • 我正在研究2.2 Froyo,这些方法并不适用. (4认同)

Orr*_*Orr 7

要支持所有API级别,您可以像这样使用:

ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
Run Code Online (Sandbox Code Playgroud)