我怎样才能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类中的静态方法,传递视图以及您想要设置的值。
我会推荐使用setTranslationX
和setTranslationY
。 我只是自己开始做这件事,但这似乎是移动视图的最安全和首选的方式。 我想这很大程度上取决于你想要做什么,但是对于我来说,这对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);
- 你怎么把一个ListView边框?
- 获取android.content.res.Resources $ NotFoundException:即使资源存在于android中也是exception
- xCode 6 beta 7:故事板在右侧和左侧增加了额外的空间
- 是否可以使用<span />closures跨度?
- AutoLayout:removeFromSuperview / removeConstraints抛出exception,并崩溃困难
- 如何创build横向维度完整的对话框
- 如何强制两个数字留在LaTeX的同一页面?
- 为什么我的android活动总是开始滚动到底部?
- Android:使用FrameLayout将buttonalignment到屏幕的右下angular?