如何在Android中动态设置视图位置?
如何通过代码更改视图的位置?比如改变它的X,Y位置。是否可能?设置此视图相对于其父视图的左侧位置:如何在Android中动态设置视图位置?,android,layout,view,Android,Layout,View,如何通过代码更改视图的位置?比如改变它的X,Y位置。是否可能?设置此视图相对于其父视图的左侧位置: view.setLeft(int leftPosition); view.setRight(int rightPosition); view.setTop(int topPosition); view.setBottom(int bottomPositon); 设置此视图相对于其父视图的正确位置: view.setLeft(int leftPosition); view.setRight
view.setLeft(int leftPosition);
view.setRight(int rightPosition);
view.setTop(int topPosition);
view.setBottom(int bottomPositon);
设置此视图相对于其父视图的正确位置:
view.setLeft(int leftPosition);
view.setRight(int rightPosition);
view.setTop(int topPosition);
view.setBottom(int bottomPositon);
设置此视图相对于其父视图的顶部位置:
view.setLeft(int leftPosition);
view.setRight(int rightPosition);
view.setTop(int topPosition);
view.setBottom(int bottomPositon);
设置此视图相对于其父视图的底部位置:
view.setLeft(int leftPosition);
view.setRight(int rightPosition);
view.setTop(int topPosition);
view.setBottom(int bottomPositon);
上述方法用于设置视图与其父视图相关的位置。如果您使用的是蜂巢Sdk(API级别11),则可以尝试使用以下方法 参数x是此视图的可视x位置
view.setY(float y);
参数y是此视图的可视y位置
view.setY(float y);
我希望这对你有帮助。:) 使用
RelativeLayout
,将视图放入其中,从视图中获取RelativeLayout.LayoutParams
对象,并根据需要设置边距。然后在视图上调用requestLayout()
。这是我知道的唯一方法。是的,您可以在Android中动态设置视图的位置。同样,在XML文件的LinearLayout
中也有一个ImageView
。因此,您可以通过LayoutParams
设置其位置。但请确保根据XML文件中的布局设置LayoutParams
。根据所采用的布局,有不同的layoutparms
以下是要设置的代码:
LayoutParams layoutParams=new LayoutParams(int width, int height);
layoutParams.setMargins(int left, int top, int right, int bottom);
imageView.setLayoutParams(layoutParams);
对于蜂窝(API级别11)以下的任何内容,您必须使用
setLayoutParams(…)
如果您可以将您的支持限制在蜂窝和更高级别,那么您可以使用
setX(…)
,setY(…)
,setLeft(…)
,setTop(…)
,等等。我建议使用setTranslationX
和setTranslationY
。我自己才刚刚开始,但这似乎是移动视图的最安全和首选方式。我想这在很大程度上取决于你到底想做什么,但这对我来说在2D动画方面效果很好。有一个名为的库,它允许你使用蜂巢动画库一直到版本1
这意味着您可以使用稍微不同的界面定义左、右、平移X/Y
以下是它的工作原理:
ViewHelper.setTranslationX(view, 50f);
您只需使用ViewHelper类中的静态方法,传递视图以及要将其设置为哪个值。使用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),但这不会设置组件的位置,它将只设置组件左边框的位置,其余部分将保持在相同的位置。对于所有API级别的支持,您可以这样使用:
ViewPropertyAnimator.animate(view).translationYBy(-yourY).translationXBy(-yourX).setDuration(0);
int childCount = parent.getChildCount();
parentView.addView(newView, childCount);
已经有不同的有效答案,但除了相应的API级别限制外,似乎没有一个正确建议在哪种情况下使用哪种方法:
- 如果可以等待布局周期,并且父视图组支持
(或子类),请相应地设置MarginLayoutParams
/marginLeft
marginTop
- 如果您需要立即且持续地更改位置(例如,对于弹出菜单锚点),请使用相同的坐标另外调用
。这将优先于布局系统稍后将确认的内容layout(l,t,r,b)
- 对于即时(临时)更改(如动画),请改用
/setX()
。如果父级大小不依赖于WRAP_子级,则可以专门使用setY()
/setX()
setY()
- 切勿使用
/setLeft()
/setRight()
/setBottom()
,请参见下文setTop()
mLeft
/mTop
/mBottom
/mRight
字段将从layout()中相应的布局参数中填充。Android视图布局系统隐式异步调用布局。因此,设置MarginLayoutParams
似乎是永久设置位置的最安全、最干净的方法。但是,在某些情况下,异步布局延迟可能是一个问题,例如,当使用视图渲染光标时,它应该被重新定位并同时充当弹出菜单锚定。在这种情况下,调用layout()
对我来说很好
setLeft()
和setTop()
的问题是:
- 仅调用它们是不够的——您还需要调用
和setRight()
以避免拉伸或收缩视图setBottom()
- 这些方法的实现看起来相对复杂(=做一些工作来解释它们各自导致的视图大小更改)
- 它们似乎会导致输入字段出现奇怪的问题:
setX()
和setY()
在布局系统之外工作,相应的值被视为与布局系统确定的左/上/下/右值的附加偏移,从而相应地移动视图。它们似乎是为动画而添加的(需要不经过布局周期的即时效果) 我发现@Stefan Haustein与我的经验非常接近,但不确定100%。我的建议是:
/setLeft()
/setRight()
/setBottom()
有时不起作用setTop()
- 如果要在添加并显示视图时临时设置位置(例如,用于制作动画,不影响层次结构),只需使用