View

public class
View
extends Object
implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource
java.lang.Object
↳ android.view.View

Known Direct Subclasses
AnalogClock, ImageView, KeyboardView, MediaRouteButton, ProgressBar, Space, SurfaceView, TextView, TextureView, ViewGroup, ViewStub

Known Indirect Subclasses
AbsListView, AbsSeekBar, AbsSpinner, AbsoluteLayout, ActionMenuView, AdapterView, AdapterViewAnimator, AdapterViewFlipper, and 99 others.

Class Overview(类的概述)

这个类代表了用户界面组件的基本构建区域。一个View在屏幕上占据了一个矩形的区域并且负责绘制图形和事件处理。View是窗口小部件的基类,被用来创建可交互的UI组件(比如:buttons, text fields 等等)。它的子类ViewGroup 是layouts的基类,是一个看不见的容器可以装载另外一些View或者另外的ViewGroup和 定义它们的布局属性。

Using Views(使用Views)

窗口中的所有View都被排列在一棵树形结构中。你可以从代码中添加View,或者通过一个或多个XML布局文件中指定一个视图树来添加view。这里有许多专门的View子类,来作为控制或显示文本,图像,或其他内容。
一旦你创建一个View的树,通常有几种常见的操作,你可能希望执行。

  • 设置属性:比如在一个TextView上设置文本。可用的属性和设置它们的方法在不同的子类中会有所不同。注意在编译时已知的属性可以在XML布局文件中设置。
  • 设置焦点:framework 将会处理移动焦点来响应用户输入。对一个指定的View上强制获得焦点,调用方法requestFocus()。
  • 设置监听器:View允许用户设置监听器,当一些在View上发生了感兴趣的事时,View能够被通知。例如:所有的View会让你设置一个监听器来通知你View获得和失去焦点。你可以注册这样一个监听器setOnFocusChangeListener(android.view.View.OnFocusChangeListener)。其他View的子类提供更多专业的监听器。
  • 设置可见:你可以隐藏或者显示view,通过使用方法setVisibility(int).

Implementing a Custom View(实现自定义View)

为了实现一个自定义View,你将会重写framework 调用所有View的一些标准方法。你不需要重写所有这些方法,事实上,你可以仅仅重写onDraw(android.graphics.Canvas)方法。
这里写图片描述

IDs

View都有一个相关联的整数id,这些id被分配在布局文件中,然后别又来找到指定的View。一个共同的模式就是:

 <Button
     android:id="@+id/my_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/my_button_text"/>
Button myButton = (Button) findViewById(R.id.my_button);

Position

View的形状为矩形,它有一个位置,表示为左边和顶部的坐标和两个尺寸,表示宽度和高度。位置和尺寸的单位是像素。
通过调用方法getLeft()和getTop()可能获得view的位置。前者返回代表View矩形的左边或者x坐标。后面返回代表View矩形的顶部或Y坐标。这些方法都返回相对于它父类视图的位置。另外,当getLeft()返回20,意味着view位于它直接父View中右边的左边缘20像素。
另外,还提供几个方便的方法来避免不必要的计算,像getRight()和getBottom()。这些方法返回代表View矩形的右边和底部的坐标。例如,调用getRight()等同于getLeft() + getWidth() 。

Size, padding and margins

View的大小用一个宽度和一个高度来表示。View实际上拥有两对宽度和高度的值。第一对被称为测量宽度和测量高度。这些尺寸定义了view在父view中大小。这个计算的尺寸通过getMeasuredWidth() 和getMeasuredHeight()来获得。第二对简单的称为宽度和高度,或者有时称为绘制宽度和绘制高度。这些尺寸定义了在绘制时和布局之后,屏幕中view的实际尺寸。这些值不同于测量宽度和高度,不是必须有。宽度和高度能够通过getWith()和getHeight()获得。
为了测量它的尺寸,view考虑了它的padding。padding用View的左上右下的像素表示。Padding被用于View中内容的指定偏移像素。例如,左边的2个pading将会把view中内容往左推2像素。
Padding 能够使用方法 setPadding(int, int, int, int) 或者 setPaddingRelative(int, int, int, int) 方法来设置,通过调用方法getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom(), getPaddingStart(), getPaddingEnd()来取值.
即使View能定义一个Padding,它不提供任何来支持margins。但是ViewGroups提供一个支持。

Layout

Layout有两个过程:一个测量过程和一个布局过程。测量过程在measure(int, int) 方法中实现,它是View树种自上而下的遍历。在遍历过程中每个view将尺寸规格设置到该树上。在测量结束的时候,每个view保存了它的测量值。布局过程发生在 layout(int, int, int, int) 中,它同样也是自上而下的。在布局的过程中每个父view使用计算的大小为它的子view的位置负责。
当一个View的measure()方法返回后,它的getMeasuredWidth() 和getMeasuredHeight() 值必须与view的子view们一起被被设置。View的测量宽度和测量高度必须受到父view的约束。这就保证了在测量结束的时候,所有的父view接收了所有它们子view的测量。一个父view调用的measure() 次数多于它的子view。例如,父view可能测量每一个没有指定尺寸子view来确定他们的大小,然后再一次调用measure()以实际子view的数量。
测量过程使用两个类来传递尺寸。View.MeasureSpec 类被View用来告诉父view他们希望如何被测量和定位。LayoutParams 的基类仅仅描述这个view希望多大的宽度和高度。对于每个尺寸,它能指定一个
an exact number
MATCH_PARENT
WRAP_CONTENT
不同的ViewGroup类拥有不同的LayoutParams 的子类。例如,AbsoluteLayout 拥有自身LayoutParams 的子类,能够添加一个X和一个Y值。
为了启动一个布局过程,调用requestLayout()的方法。这个方法通常在View相信不再适合它当前的界限时调用。

Drawing

绘制被运行的tree来处理,记录了需要更新的view的绘制命令。在此之后,整个树绘制命令被发送到屏幕上,裁剪到新的区域。
这个树很大程度上被记录和绘制下来,父view在子view之前绘制,其他的view按照tree中显示顺序来绘制。如果你为一个view设置了一个背景色,然后这个view将在调用onDraw()之前绘制它。
强制一个view去绘制,调用方法invalidate().

Event Handling and Threading

一个view的基本周期如下:
1.一个事件发生并且被分发到相关的View。这个view处理这个事件并且通知监听器
2.如果在处理事件的过程中,这个View的界限可能需要改变,这个view将会调用requestLayout().
3.类似的,如果在处理时间的过程中,这个View的外观可能需要改变,这个view将会重新调用invalidate().
4.如果 requestLayout() 或者invalidate() 被调用,framework 将处理测量,布局,和绘制tree。
注意:整个View的tree是一个单线程的,你必须在UI线程中调用任何view的方法。如果你正在其他的线程中做一些工作并想要更新view的状态,你应该使用一个Handler。

Focus Handling

framwork将会处理常规的焦点移动来响应用户的输入,焦点的改变包括view的移除或隐藏,或新的View变得可见。View通过方法isFocusable() 来声明是否能获得焦点。为了改变一个View能否获得焦点,通过调用方法setFocusable(boolean)。当在触摸模式中的view声明它们是否想要获得焦点可以通过方法isFocusableInTouchMode()和通过setFocusableInTouchMode(boolean)改变view是否能获得焦点。
想要使一个指定的View来获得焦点,可以调用方法requestFocus()。

Touch Mode

当用户通过方向键正在导航用户界面,把焦点集中在可操作的部件中是必要的,比如button,这样就能使用户看到什么将会被采取输入。如果这个设备拥有触摸功能,而且用户开始与界面交互,对于一个指定的View不再需要总是显示高亮,或者获得焦点。这激发了一个交互模式叫做“touch mode”
对于一个可触摸的设备,一旦用户触摸了屏幕,这个设备将进入touch mode。从这刻起,只有view的isFocusableInTouchMode() 为true时才可以获得焦点,比如文本编辑部件。另外的view都是可触摸的,比如button,当被触摸时将不会获得焦点,它们只有在点击的监听器中激发。
任何时候用户点击方向键,将会退出touch mode,并且找到一个View获得焦点,因此用户可以恢复与用户界面的交互而不用再次触摸这个屏幕。
touch mode的状态仍然通过Activity调用isInTouchMode() 来确认该设备是否处于touch mode。

Scrolling

framework 为View提供了基本的支持滚动滑动它的内容。这包括跟踪X和Y的滚动偏移以及绘制滚动机制。

Tags

不像id,tag不是被用来标识view。tags是一个能够与View关联的额外的信息片段。它们经常被用于存储在view自身上并且与View相关的数据,而不是把它们放在一个独立的结构中。

Properties

View类暴露了一个ALPHA的属性,以及几个transform-related属性,比如TRANSLATION_X 和TRANSLATION_Y。这些属性都可以从属性的表格中以及相似命名的setter/getter方法中获得。这些属性可以被用来设置这些视图相关的属性的持久的状态。这些属性和方法也能够用于结合动画,描述动画的细节。

Animation

从android 3.0 开发,动画的首选方式是使用android.animation 包中的APIs。这些动画的基本类改变的是view属性的实际值,比如 alpha值和 translationX 值。3.0之前的动画只是view绘制动画的显示。特别的是,ViewPropertyAnimator的类使得View的属性动画更加容易和有效。
另外,你可以使用3.0之前的动画类来渲染view。你可以使用setAnimation(Animation) 或startAnimation(Animation)来附加一个动画对象到一个View上。这个动画可以改变view中的scale,rotation,translation 和alpha。如果添加动画的view有子view,那么这个动画将会影响整个子树。当动画开始后,framework将会处理相关view的重绘,直到动画的结束。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值