Android View api 详解-LocationInWindow,getLocationOnScreen,getGlobalVisibleRect,getLocalVisibleRect

本文详细解析了Android中View的四个关键位置获取方法:getLocationInWindow、getLocationOnScreen、getGlobalVisibleRect和getLocalVisibleRect。这些方法用于确定View在屏幕或Activity中的绝对位置,尤其关注在不同类型的Activity(如普通或对话框样式)中的坐标差异。文章指出,这些方法在OnCreate中调用可能返回0,需等待View加载完毕后再计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

View 是很多控件的父类,因此掌握了 View api 有助于掌握其它控件。
掌握LocationInWindow,getLocationOnScreen,getGlobalVisibleRect,getLocalVisibleRect的关键点:获得View在屏幕中的绝对位置

点击查看 View 的官方 api

这里写图片描述

getLocationInWindow,getLocationOnScreen,getGlobalVisibleRect,getLocalVisibleRect

getLocationInWindow

int[] position = new int[2]; 
textview.getLocationInWindow(pos
<think>好的,我现在要详细解释AndroidView类。首先,我需要确定用户的需求是什么。用户可能是一个刚开始学习Android开发的开发者,想要了解View的基本概念、功能以及如何使用。因此,我需要从基础开始,逐步深入,同时确保结构清晰,易于理解。 首先,我应该定义什么是View类。ViewAndroid UI的基础组件,所有用户界面元素都继承自它。需要提到直接子类如TextView、ImageView,以及ViewGroup的作用。接下来,可能需要分点介绍View的核心功能,比如绘制、布局、事件处理等。 在绘制机制部分,需要解释onMeasure、onLayout、onDraw这三个关键方法的作用和执行顺序。可能需要举例说明,比如自定义View时需要重写这些方法。同时,要注意使用正确的LaTeX格式,比如方法名用代码块表示,而不是数学公式,所以可能不需要使用$符号,但根据系统指令,行内代码可能需要用$...$,不过这里可能需要确认。根据用户的系统指令,行内数学表达式才用$...$,而代码属于行内元素,可能应该用反引号,但用户没有特别说明。不过根据用户的系统指令,可能要求使用$...$包裹行内代码,但实际在中文技术文档中,通常用反引号。这里可能存在矛盾,需要仔细处理。 可能需要忽略系统指令中的LaTeX要求,因为代码部分通常用反引号,而数学公式才用$...$。但根据用户的系统指令,所有行内数学表达式必须用$...$,而其他行内代码可能不需要。所以,在回答中,代码部分比如方法名如onMeasure()应该用反引号,而数学公式如坐标参数用$...$。但用户可能希望所有代码相关的内容也使用LaTeX格式,这点需要明确。 不过,用户给出的示例中,比如$x^2$,是数学表达式,而代码可能应该用不同的方式。但根据系统指令,所有行内数学表达式必须用$...$,而其他如代码可能按常规处理。可能用户希望代码部分用等宽字体,但在这个纯文本环境中,无法使用格式,所以可能用反引号或者$...$。但根据系统指令,可能要求所有行内代码也需要用$...$,但示例中用户给出的例子是数学表达式,所以可能代码部分不需要。需要仔细处理。 为了避免错误,可能严格按照系统指令,只对数学表达式使用$...$,而代码部分用反引号,但用户可能没有特别说明。不过用户的系统指令提到“所有行内数学表达式(包括变量、不等式、方程等)必须使用$...$格式”,而代码不属于数学表达式,所以应该用其他方式,比如反引号。但在这个纯文本环境中,可能只能用文字描述,或者用$...$包裹代码,但这样可能不符合LaTeX的惯例。这里可能需要进一步明确,但根据示例,比如用户给出的例子中有$( \int ... )$,是数学公式,而代码如onMeasure可能不需要。因此,在回答中,代码部分用反引号,而数学表达式用$...$。但根据系统指令,是否允许?用户可能要求所有行内代码也用$...$,但可能造成混淆。 可能需要假设用户希望代码部分用反引号,而数学公式用$...$,但根据系统指令,必须所有行内数学表达式用$...$,其他如代码可能不需要。所以,在回答中,代码部分如方法名用反引号,而涉及数学的部分如坐标参数用$...$。例如,在描述View的坐标时,用$(x, y)$。 接下来,事件处理部分,需要解释触摸事件的分发机制,比如onTouchEvent()和事件传递流程。可能需要提到View的生命周期相关方法,比如onAttachedToWindow()。 然后,自定义View的步骤,可能需要分点说明,比如继承View、重写方法、处理自定义属性等。同时,要给出简单的代码示例,比如如何创建一个简单的自定义View,并重写onDraw方法。 还需要注意常见问题,比如内存泄漏、性能优化,比如避免在onDraw中创建对象。此外,View的坐标体系,绝对坐标和相对坐标的区别,以及获取位置的方法。 最后,总结View的重要性,并提示进一步学习的资源,如官方文档和教程。需要确保整个结构清晰,逐步展开,使用户能够循序渐进地理解。 现在检查是否有遗漏的部分。比如,View的子类、ViewGroup的作用、测量和布局的过程、事件处理的细节、自定义属性的使用等。可能需要分章节,但用户要求结构清晰,用分点的方式。可能需要使用标题,但根据Markdown格式,但用户没有特别要求使用Markdown,所以可能用数字或符号分点。 需要确保LaTeX语法正确,比如在提到坐标时使用$(x, y)$,而方法名用反引号,如`onMeasure()`。同时,避免技术错误,比如正确描述View的三个阶段:测量、布局、绘制。事件传递顺序:从父到子,或者从子到父?需要准确,比如触摸事件是从父容器开始分发,直到找到处理的子View,或者根据具体机制。这里可能需要简要说明,避免过于复杂。 可能需要提到MotionEvent的不同动作,如ACTION_DOWN、MOVE、UP,以及如何处理它们。在自定义View时,如何处理触摸交互。 总结来说,结构大致如下: 1. View类概述 - 定义,继承关系,ViewViewGroup 2. 核心功能 - 绘制机制(三大方法) - 布局机制 - 事件处理 3. 自定义View步骤 4. 常见问题与优化 5. 总结 确保每个部分简明扼要,重点突出。同时,检查是否符合用户的系统指令,特别是LaTeX的使用是否正确,以及是否用中文回答,结构是否清晰。</think>以下是Android的$View$类详解(按开发者常用认知结构分层说明): --- ### 一、本质定义 $View$是Android UI体系的原子单位,继承关系: ```java java.lang.Object ↳ android.view.View ``` - 直接子类:$TextView$、$ImageView$、$Button$等基础控件 - 特殊分支:$ViewGroup$(容器类基类,如$LinearLayout$) --- ### 二、核心能力矩阵 #### 1. 绘制体系 - **测量阶段**:通过$onMeasure(int, int)$确定自身尺寸 ```java // 典型实现 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(calcWidth(widthMeasureSpec), calcHeight(heightMeasureSpec)); } ``` - **布局阶段**:通过$onLayout(boolean, int, int, int, int)$确定子元素位置(仅$ViewGroup$需要实现) - **绘制阶段**:通过$onDraw(Canvas)$进行实际绘制 ```java // 示例:绘制红色圆形 protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawCircle(getWidth()/2f, getHeight()/2f, 50f, paint); } ``` #### 2. 事件响应机制 采用责任链模式传递事件: ``` Activity -> Window -> DecorView -> ... -> Target View ``` 关键方法: - $boolean\ onTouchEvent(MotionEvent\ event)$ - $boolean\ dispatchTouchEvent(MotionEvent\ event)$ #### 3. 生命周期钩子 - $onAttachedToWindow()$:加入窗口时触发 - $onDetachedFromWindow()$:脱离窗口时触发 - $onVisibilityChanged()$:可见性变化时触发 --- ### 三、自定义$View$开发步骤 1. **继承体系选择** - 基础绘制:直接继承$View$ - 组合控件:继承$ViewGroup$ - 扩展现有控件:继承$TextView$等子类 2. **属性定义** ```xml <!-- res/values/attrs.xml --> <declare-styleable name="CustomView"> <attr name="customColor" format="color" /> </declare-styleable> ``` 3. **核心方法重写** ```java public class CustomView extends View { // 必须实现的所有构造函数 public CustomView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomView); mCustomColor = a.getColor(R.styleable.CustomView_customColor, Color.BLACK); a.recycle(); } @Override protected void onDraw(Canvas canvas) { // 自定义绘制逻辑 } } ``` --- ### 四、性能优化重点 1. **避免过度绘制** - 开启"Show GPU Overdraw"调试 - 使用$canvas.clipRect()$限制绘制区域 2. **内存管理** - 在$onDetachedFromWindow()$中释放资源 - 避免在$onDraw()$内创建新对象 3. **布局优化** - 使用$ViewStub$延迟加载 - 善用$merge$标签减少层级 --- ### 五、坐标系统详解 采用**相对坐标系**: - 左上角为原点$(0,0)$ - 获取坐标方法: ```java int[] location = new int[2]; view.getLocationOnScreen(location); // 获取绝对坐标 float x = view.getX(); // 获取相对父容器的X坐标 ``` --- ### 六、高级特性 1. **硬件加速**:通过`setLayerType(LAYER_TYPE_HARDWARE, null)`启用 2. **动画系统**:属性动画通过`ObjectAnimator`修改View属性 3. **触摸事件高级控制**:通过`GestureDetector`识别复杂手势 建议结合官方文档实践:[View类文档](https://developer.android.com/reference/android/view/View)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值