Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中动态设置视图位置?_Android_Layout_View - Fatal编程技术网

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

如何在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

如何通过代码更改视图的位置?比如改变它的X,Y位置。是否可能?

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

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()
    /
    setY()
    。如果父级大小不依赖于WRAP_子级,则可以专门使用
    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()
    有时不起作用
  • 如果要在添加并显示视图时临时设置位置(例如,用于制作动画,不影响层次结构),只需使用