前言
之前在做动画的时候, 想要获取一下button的坐标的时候, 直接在onCreate里调用button的getX(),getY()方法, 但是返回的结果是0, 后来上网找到了一些方法, 以此谨记.
view.post(Runnable)
我们调用的这个post方法是在view测量完之后, 所以才会获取的到
mBtn.post(new Runnable() { @Override public void run() { mBtnY = mBtn.getY(); mBtnX = mBtn.getX(); Log.d("xxx", "x: " + mBtnX); Log.d("xxx", "y: " + mBtnY); Log.d("xxx", "height: " + mBtn.getHeight()); Log.d("xxx", "width: " + mBtn.getWidth()); } });
log信息
D/xxx: x: 810.0 D/xxx: y: 1446.0 D/xxx: height: 195 D/xxx: width: 195
延时获取
这个方法跟上面的类似, 感觉没有上面的把握的精准
new Thread(new Runnable() { @Override public void run() { synchronized (this){ try { wait(1000); } catch (InterruptedException e) { e.printStackTrace(); } mBtnY = mBtn.getY(); mBtnX = mBtn.getX(); Log.d("xxx", "x: " + mBtnX); Log.d("xxx", "y: " + mBtnY); Log.d("xxx", "height: " + mBtn.getHeight()); Log.d("xxx", "width: " + mBtn.getWidth()); } } }).start();
打印的信息同上
ViewTreeObserver
这个方法感觉是比较好的一种方式, 注册监听视图树的观察者, 在视图树中全局事件改变时得到通知.
mBtn.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mBtn.getViewTreeObserver().removeOnGlobalLayoutListener(this); mBtnY = mBtn.getY(); mBtnX = mBtn.getX(); mScreenHeight += mBtnY; Log.d("xxx", "x: " + mBtnX); Log.d("xxx", "y: " + mBtnY); Log.d("xxx", "height: " + mBtn.getHeight()); Log.d("xxx", "width: " + mBtn.getWidth()); } });
注: 这个方法是api16以上用的
Android 如何获取View的高宽、坐标
最新推荐文章于 2021-12-20 11:53:10 发布