我怎样才能dynamic设置在Android中的视图的位置?

如何通过代码改变视图的位置? 像改变它的X,Y的位置。 可能吗?

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

如果你可以限制对Honeycomb的支持,你可以使用setX(...)setY(...)setLeft(...)setTop(...)

是的,你可以在Android中dynamic设置视图的位置。 同样,你的xml文件的LinearLayout中有一个ImageView 。所以你可以通过LayoutParams来设置它的位置。但是一定要根据你的xml文件中的布局取得LayoutParams根据布局的不同,有不同的LayoutParams

这里是要设置的代码:

  LayoutParams layoutParams=new LayoutParams(int width, int height); layoutParams.setMargins(int left, int top, int right, int bottom); imageView.setLayoutParams(layoutParams); 

希望对你有所帮助。

有一个名为NineOldAndroids的库,它允许您将Honeycombanimation库一直使用到版本一。

这意味着你可以用一个稍微不同的界面来定义左侧,右侧,translationX / Y。

下面是它的工作原理:

 ViewHelper.setTranslationX(view, 50f); 

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

我会推荐使用setTranslationXsetTranslationY 。 我只是自己开始做这件事,但这似乎是移动视图的最安全和首选的方式。 我想这很大程度上取决于你想要做什么,但是对于我来说,这对2Danimation来说非常有效。

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

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

  • 如果您需要立即更改位置(例如对于PopupMenu锚点),请使用相同的坐标另外调用layout(l, t, r, b) 。 这预先规划了系统将在以后确认的内容。

  • 对于立即(临时)更改(如animation),请改用setX() / setY() 。 在父大小不依赖于WRAP_CHILDREN的情况下,单独使用setX() / setY()

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

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

setLeft()setTop()是:

  • 单独调用它们是不够的 – 还需要调用setRight()setBottom()以避免延伸或缩小视图。

  • 这些方法的实现看起来相对复杂(=做一些工作来说明由它们每个造成的视图大小变化)

  • 他们似乎导致奇怪的问题与input字段: EditText软数字键盘有时不允许数字

setX()setY()在布局系统之外工作,相应的值被视为由布局系统确定的左/上/下/右值的附加偏移量,从而相应地移动视图。 他们似乎已被添加为animation(如果没有通过布局周期的立即效果是必需的)。

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

 view.setX(float x); 

参数x是该视图的视觉x位置。

 view.setY(float y); 

参数y是这个视图的视觉y位置。

我希望这对你有帮助。 🙂

设置此视图相对于其父项的左侧位置:

 view.setLeft(int leftPosition); 

设置此视图相对于其父项的正确位置:

 view.setRight(int rightPosition); 

设置此视图相对于其父项的顶部位置:

 view.setTop(int topPosition); 

设置这个视图的底部位置相对于它的父级:

 view.setBottom(int bottomPositon); 

以上方法用于设置与父级相关的视图的位置。

使用LayoutParams。 如果您使用的是LinearLayout,则必须导入android.widget.LinearLayout.LayoutParams,否则为您使用的布局导入正确版本的LayoutParams,否则将导致ClassCastException ,那么:

 LayoutParams layoutParams=new LayoutParams(int width, int height); layoutParams.setMargins(int left, int top, int right, int bottom); imageView.setLayoutParams(layoutParams); 

NB:注意你也可以使用imageView.setLeft(int dim),但是这不会设置组件的位置,它只会设置组件的左边框的位置,其余的会保持在同一个位置。

使用RelativeLayout ,放置你的视图,从你的视图中获取RelativeLayout.LayoutParams对象,并根据需要设置边距。 然后在你的视图上调用requestLayout() 。 这是我知道的唯一方法。

为了支持所有的API级别,你可以像这样使用它 :

 ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);