Android View深度解析:滑动与事件分发机制

需积分: 0 1 下载量 186 浏览量 更新于2024-08-04 收藏 20KB DOCX 举报
"这篇文档详尽地汇总了Android开发中关于View的相关知识,涵盖了View的滑动方式、事件分发机制以及View的加载流程等重要概念。这些内容对于提升开发者在Android应用开发中的技能和面试准备至关重要。" 在Android开发中,View是最基本的构建块,所有用户界面组件都是基于它进行扩展的。理解并掌握View的工作原理对于创建高效、性能优化的应用至关重要。以下是对View关键知识点的深入解析: 1. **View的滑动方式**: - a. `layout(left, top, right, bottom)`:直接修改View的边界坐标,使其在父视图中的位置发生变化。 - b. `offsetLeftAndRight()` 和 `offsetTopAndBottom()`:这两个方法用于相对当前位置平移View。 - c. `LayoutParams`:通过修改布局参数,如margin或padding,间接调整View的位置。 - d. 动画移动:普通动画不会改变View的实际位置,而属性动画(Property Animation)可以。 - e. `scrollTo()` 和 `scrollBy()`:这两个方法用于滚动View的内容,而不是改变其坐标。屏幕上的内容看起来像是向相反方向移动。 - f. `Scroller`:Scroller是一个插值器,用于计算平滑滚动过程中的当前位置,但不直接执行滚动。需配合`computeScroll()`方法,通过不断重绘和调用`scrollTo()`实现平滑滚动。 2. **View的事件分发机制**: - 点击事件的传递始于Activity的`dispatchTouchEvent()`,经PhoneWindow到达DecorView,然后传递给根ViewGroup。 - ViewGroup的`dispatchTouchEvent()`会调用`onInterceptTouchEvent()`,决定是否拦截事件。 - 如果不拦截,事件会向下传递到子View,执行子View的`dispatchTouchEvent()`。如果有`OnTouchListener`,`onTouch()`会被调用,其返回值决定是否执行`onTouchEvent()`。 - 在`onTouchEvent()`的`ACTION_UP`事件中,如果设置了`OnClickListener`,则会触发`onClick()`方法。 3. **View的加载流程**: - 当一个View被添加到视图树中,系统会依次执行`measure()`、`layout()`和`draw()`三个步骤,确保View的大小、位置和绘制得以确定。 - `measure()`方法计算View的尺寸,遵循MeasureSpec规则。 - `layout()`方法根据测量结果确定View的位置。 - `draw()`方法将View及其内容渲染到屏幕上。 这些知识不仅是Android开发者的基本功,也是面试中常考的内容。熟悉和掌握这些原理将有助于开发者设计出更加健壮和高效的用户界面。

# -*- coding: UTF-8 -*- from lib2to3.pgen2 import driver from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy el1 = driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value="通讯录") el1.click() el2 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.widget.ListView/android.widget.FrameLayout[3]/android.widget.RelativeLayout") el2.click() el3 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[1]/android.widget.TextView") el3.click() el4 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[8]") el4.click() el5 = driver.find_element(by=AppiumBy.XPATH, value="/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.view.ViewGroup[11]") el5.click()

2023-06-08 上传