【Android】getLeft(),getRight()值为0,应在何时正确获取他们的值

2024-04-03 20:58

本文主要是介绍【Android】getLeft(),getRight()值为0,应在何时正确获取他们的值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.问题所在
.getLeft()  .getRight()  .getTop()  .getBottom(),是获取当前view相对于父view的相应距离,但是获取的时机错误的话,view的四个值就获取不到。先来看个例子


我一共在六个地方获取了view的getLeft和getRight
1)在onCreate中获取
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_testanim);
    initPop();
    mHandlerPlus = new HandlerPlus(this);
    mImg = (ImageView) findViewById(R.id.mImg_pop);
    Log.e(TAG, "onCreate: &&&&&&&&&&&&&&");
    Log.e(TAG, "mImg.getLeft()--->"+mImg.getLeft());
    Log.e(TAG, "mImg.getRight()--->"+mImg.getRight());
}

2)在onAttachToWindow中获取

@Override
public void onAttachedToWindow() {super.onAttachedToWindow();
    Log.e(TAG, "onAttachedToWindow: *************************");
    Log.e(TAG, "mImg.getLeft()--->"+mImg.getLeft());
    Log.e(TAG, "mImg.getRight()--->"+mImg.getRight());
}
3)在布局监听中获取

View.OnAttachStateChangeListener mOnAttachStateChangeListener = new View.OnAttachStateChangeListener() {@Override
    public void onViewAttachedToWindow(View v) {parentHeight = getWindowWH(1);
        parentWidth = getWindowWH(0);
        viewHeight = dealViewWH(img_one, 1);
        viewWidth = dealViewWH(img_one, 0);
        Log.e(TAG, "onViewAttachedToWindow: =====================");
        Log.e(TAG, "mImg.getLeft()--->"+mImg.getLeft());
        Log.e(TAG, "mImg.getRight()--->"+mImg.getRight());

    }@Override
    public void onViewDetachedFromWindow(View v) {}
};
4)在视图树的监听中获取

mImg.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Override
    public void onGlobalLayout() {Log.e(TAG, "onGlobalLayout:++++++++++++++++++++ ");
        Log.e(TAG, "mImg.getLeft()--->"+mImg.getLeft());
        Log.e(TAG, "mImg.getRight()--->"+mImg.getRight());
    }
});
5)在view的post中异步获取

mImg.post(new Runnable() {@Override
    public void run() {Log.e(TAG, "run: $$$$$$$$$$$$$$$$");
        Log.e(TAG, "mImg.getLeft()--->"+mImg.getLeft());
        Log.e(TAG, "mImg.getRight()--->"+mImg.getRight());
    }
});
6)在window焦点改变的时候获取

@Override
public void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);
    if (hasFocus){Log.e(TAG, "onWindowFocusChanged: %%%%%%%%%%%%%%%%%");
        Log.e(TAG, "mImg.getLeft()--->"+mImg.getLeft());
        Log.e(TAG, "mImg.getRight()--->"+mImg.getRight());
    }
}
只有后三种的获取时机下才真确的拿到了值。

2.原因所在
一个view要在界面上显示,要经过Measure,Layout,Draw三个步骤,view的位置确定是在Measure和Layout之后才被赋予的,所以要在view完成上述两个步骤之后才能正确获取到相应的数值
在(4)视图树中可以拿到值,但是这个方法会调用两次,会对你以后的操作产生影响

这篇关于【Android】getLeft(),getRight()值为0,应在何时正确获取他们的值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873964

相关文章

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,