Android开发:如何将RelativeLayout垂直平移自身高度的50%?
解决RelativeLayout垂直平移自身高度50%的问题
嗨,我完全懂你遇到的这个头疼问题——XML里直接写百分比平移不管用,在onCreate里拿控件高度又总是返回0,这确实挺让人摸不着头脑的。我来给你拆解下背后的原因,再分享几个靠谱的解决办法:
为什么onCreate里拿不到真实高度?
当onCreate方法执行时,你的RelativeLayout还没走完系统的测量与绘制流程,此时控件的真实尺寸还没被计算出来,所以getHeight()返回0是正常现象。我们需要等布局完全就绪后,再去获取高度并设置平移。
靠谱的解决方法
方法1:用post()方法(最简单高效)
View的post()方法会把传入的Runnable放到视图绘制完成后的消息队列中执行,这时候就能稳稳拿到控件的真实高度了:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); RelativeLayout rl = findViewById(R.id.rl); rl.post(() -> { // 计算自身高度的50%作为垂直平移距离 float translateY = rl.getHeight() * 0.5f; rl.setTranslationY(translateY); }); }
如果你的项目还在用Java 8以下的版本,换成匿名内部类写法即可:
rl.post(new Runnable() { @Override public void run() { float translateY = rl.getHeight() * 0.5f; rl.setTranslationY(translateY); } });
方法2:用ViewTreeObserver监听布局完成
通过监听视图树的布局完成事件,在布局彻底结束后再计算并设置平移:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_layout); RelativeLayout rl = findViewById(R.id.rl); ViewTreeObserver observer = rl.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // 一定要移除监听,避免布局更新时重复触发 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { rl.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { rl.getViewTreeObserver().removeGlobalOnLayoutListener(this); } float translateY = rl.getHeight() * 0.5f; rl.setTranslationY(translateY); } }); }
补充:为什么XML里的百分比写法无效?
Android的translationY属性在XML中并不支持直接使用自身尺寸的百分比(比如50%),它只接受具体的dp值,或者基于父布局尺寸的百分比(比如50%p,但这是父布局高度的50%,不是控件自身的)。所以想要基于自身高度计算平移距离,必须通过代码动态处理。
内容的提问来源于stack exchange,提问作者metis
相关产品推荐
相关产品推荐

