如何通过代码更改视图的位置?就像更改其X,Y位置一样。可能吗?
如何通过代码更改视图的位置?就像更改其X,Y位置一样。可能吗?
Answers:
是的,您可以在Android中动态设置视图的位置。同样,您ImageView
在LinearLayout
xml文件中有一个in.so,因此可以通过设置其位置LayoutParams
。但是请确保LayoutParams
根据xml文件中LayoutParams
使用的布局进行选择。根据所使用的布局不同。
这是要设置的代码:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
希望对您有所帮助。
已经有不同的有效答案,但似乎没有一个能正确建议在这种情况下使用哪种方法,除了相应的API级别限制:
如果您可以等待布局周期并且父视图组支持MarginLayoutParams
(或子类),请相应地设置marginLeft
/ marginTop
。
如果需要立即且永久地更改位置(例如,对于PopupMenu锚点),请另外layout(l, t, r, b)
使用相同的坐标进行调用。这优先于布局系统以后将要确认的内容。
对于即时(临时)更改(例如动画),请使用setX()
/ setY()
。如果父级大小不取决于WRAP_CHILDREN,则最好使用setX()
/ setY()
独占。
切勿使用setLeft()
/ setRight()
/ setBottom()
/ setTop()
,请参阅下文。
背景:在mLeft
/ mTop
/ mBottom
/ mRight
字段将会从相应的LayoutParams填写布局()。布局是由Android视图布局系统隐式和异步调用的。因此,MarginLayoutParams
永久设置位置似乎是最安全,最干净的方法。但是,异步布局滞后在某些情况下可能是个问题,例如,使用View渲染光标时,异步布局滞后应重新放置并同时充当PopupMenu锚点。在这种情况下,打电话layout()
对我来说很好。
与存在的问题setLeft()
和setTop()
主要有:
仅调用它们是不够的-您还需要调用setRight()
并setBottom()
避免拉伸或缩小视图。
这些方法的实现看起来相对复杂(=做一些工作来说明由它们各自引起的视图大小变化)
它们似乎在输入字段上引起奇怪的问题:EditText软数字键盘有时不允许数字
setX()
并setY()
在布局系统之外工作,并且相应的值被视为布局系统确定的左/上/下/右值的附加偏移,从而相应地移动视图。它们似乎是为动画添加的(需要不经过布局周期即刻产生效果)。
marginLeft
可以通过setLayoutParams
与一起设置来new FrameLayout.LayoutParams(width, height)
设置marginLeft
有一个名为NineOldAndroids的库,它允许您从第一个版本一直使用Honeycomb动画库。
这意味着您可以使用略有不同的界面定义左,右,translationX / Y。
下面是它的工作原理:
ViewHelper.setTranslationX(view, 50f);
您只需要使用ViewHelper类中的静态方法,传递视图以及要将其设置为哪个值即可。
我建议使用 setTranslationX
和 setTranslationY
。我本人只是刚刚开始,但是这些似乎是移动视图的最安全和首选的方式。我想这很大程度上取决于您要尝试执行的操作,但这对于2D动画来说对我来说效果很好。
如果您使用的是HoneyComb Sdk(API级别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);
注意:请注意,您还可以使用imageView.setLeft(int dim),但不会设置组件的位置,它只会设置组件左边框的位置,其余的将保持在同一位置。
我发现@Stefan Haustein非常接近我的经验,但不确定100%。我的建议是:
setLeft()
/ setRight()
/ setBottom()
/ setTop()
不会有时工作。setX()
setY()
setLeft()
setX()
定位时要记住的一件事是,每个视图都有一个相对于其父视图的索引。因此,如果您具有三个子视图的线性布局,则在上述情况下,每个子视图将具有一个索引:0、1、2。
这样,您可以通过执行以下操作将视图添加到父视图的最后一个位置(或末尾):
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
另外,您也可以使用以下内容替换视图:
int childIndex = parentView.indexOfChild(childView);
childView.setVisibility(View.GONE);
parentView.addView(newView, childIndex);
sets the top position of this view relative to its parent. This method is meant to be called by the layout system and should not generally be called otherwise, because the property may be changed at any time by the layout.
-也许那不是一个好主意;)