Per*_*ave 113
对于Honeycomb(API Level 11)以下的任何内容,您都必须使用setLayoutParams(...).
如果你可以限制你的支持蜂窝最多可以使用setX(...),setY(...),setLeft(...),setTop(...),等.
Aka*_*shG 43
是的,您可以在Android中动态设置视图的位置.同样,你有一个ImageView在LinearLayout你的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)
我希望你能够有所帮助.
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
我建议使用 setTranslationX和 setTranslationY.我自己只是刚刚开始这个,但这些似乎是移动视图最安全和首选的方式.我想这很大程度上取决于你究竟要做什么,但这对我来说对于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位置.
我希望它对你有所帮助.:)
要支持所有API级别,您可以像这样使用它:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
Run Code Online (Sandbox Code Playgroud)