2.1.1 View 与 ViewGroup

2.1.1 View 与 ViewGroup_第1张图片

一、View与ViewGroup的概念

在Android APP中,所有的用户界面元素都是由View和ViewGroup的对象构成的。View是绘制在屏幕上的用户能与之交互的一个对象,它代表了用户界面组件的一块可绘制的空间块,每一个空间块在屏幕上占据一个长方 形区域。而ViewGroup是View的子类,同时也是 Layout 的基类,是一个用于存放其他View(和ViewGroup)对象的布局容器。因此,View的行为特征ViewGroup也具备,但同时因为 ViewGroup 是Layout的祖先,所以具备的一些其它特点是View所不具有的。

Android为我们提供了一个View和ViewGroup子类的集合,集合中提供了一些常用的输入控件(比如按钮和文本域)和各种各样的布局模式(比如线性或相对布局)。


2.1.1 View 与 ViewGroup_第2张图片
View与ViewGroup

二、View与ViewGroup有什么区别

Android 应用中的所有用户界面元素都是使用 View 和 ViewGroup 对象构建而成。View 对象用于在屏幕上绘制可供用户交互的内容。ViewGroup 对象用于储存其他 View(和 ViewGroup)对象,以便定义界面的布局。其中,View是所有UI组件的基类,而 ViewGroup是容纳这些组件的容器,其本身也是从View派生出来的。

View对象是Android平台中用户界面体现的基础单位,它是用来创建交互性的UI组件(如:按钮文本框等等)的widgets的父类。它们提供了诸如文本输入框和按钮之类的UI对象的完整实。

ViewGroup继承自View,是一种特殊的View,它可以装其他的Views(或其他的ViewGroup)。ViewGroup是布局(layouts)和views containers的父类。它的直接子类有: FrameLayout、GridLayout、LinearLayout等等。

一般来说,开发Android应用程序的UI界面都不会直接使用View和ViewGroup,而是使用这两大基类的派生类,我们只需定义内容,并使用这些 UI 组件均拥有的一组唯一的 API即可,然后进行一些基本的操作,比如:

  • 设置属性,如长、宽、着色等
    这些属性的设置通常可以用代码实现,也可以用XML文件。并用这些属性在运行时候也可以通常方法进行修改。
  • 请求焦点,可以通过函数实现焦点转换
    不同的焦点可以实现不同的背景变换等功能,焦点在Android里分为几种情况,一种是可以获取焦点,另外一种是不能获取焦点,第三种是可获取焦点,但发生在触摸状态下。
  • 设置事件监听者
    所有的View都会在本身发生变化将自身的信息广播出去。比喻点击、焦点失去得到等。通常一个事件来到,Android会将事件传 递到相应的View,然后View将事件传递到相应的Listeners。这时View需要获取焦点,如果需要重新绘制View的话,需要调用 invalidate(0或者reqeustLayout重新绘制整个界面。
  • 设置显示与隐藏,还可以对其内容设置scrolling

下面列出View和ViewGroup的直接子类和派生子类

  • View派生出的直接子类有
    ImageView,ProgressBar,TextView,ViewGroup,AnalogClock,KeyboardView,ViewStub,SurfaceView;
  • View派生出的间接子类有
    Button,CheckBox,AbsoluteLayout,AdapterView,AdapterViewAnimator,AdapterViewFlipper,AppWidgetHostView,AutoCompleteTextView,CalendarView,CheckedTextView,Chronometer,AbsListView,AbsSeekBar,AbsSpinner,CompoundButton;
  • ViewGroup派生出的直接子类有
    AbsoluteLayout,FrameLayout,LinearLayout,RelativeLayout,AdapterView,FragmentBreadCrumbs,SlidingDrawer;
  • ViewGroup派生出的间接子类有
    ListView,GridView,AbsListView,AbsSpinner,AdapterViewAnimator,AdapterViewFlipper,AppWidgetHostView,CalendarView,DatePicker,DialerFilter,ExpandableListView,Gallery,GestureOverlayView,HorizontalScrollView,ImageSwitcher;

这里特别指出:ImageView是布局具有图片效果的UI常用的类,SurfaceView是用来进行游戏开发的与一般View相比较为特殊的非常重要的类,而AbsoluteLayout、 FrameLayout、LinearLayout、RelativeLayout这几个ViewGroup的直接子类是Android UI布局中最基本的布局元素。

2.1.1 View 与 ViewGroup_第3张图片
自定义View和ViewGroup

三、自定义View和ViewGroup一些常用的方法

1、为什么要自定义View和ViewGroup?

在日常的Android开发中会经常和控件打交道,很多时候会遇到系统框架中提供的控件无法满足我们产品的设计需求,那么怎么办呢?

这时候我们可以选择先Google下有没有比较成熟的开源项目可以让我们用,当然现在Github上面的项目非常丰富,能够满足我们绝不多数的开发需求,但是在使用这些炫酷的第三方控件时还不能满足我们更细致的定制要求要怎么办呢?这时我们就要发挥自己的想象力,动手实现自己想要的控件。

这节我们主要讨论View和ViewGroup的是什么以及他们之间的关系,所以对于自动能够已控件我们只做出简单的常用方法介绍,以此让大家有个直观的感性的认识,而更多的关于自定义控件(自定义View和ViewGroup)的内容会在之后的文章中详细介绍。

2、常用方法如下:

  • protected void onDraw(Canvas canvas)
    View类中用于重绘的方法,这个方法是所有View、ViewGroup及其派生类都具有的方法,也是Android UI绘制最重要的方法。开发者可重载该方法,并在重载的方法内部基于参数canvas绘制自己的各种图形、图像效果。
  • protected void onLayout(boolean changed, int left, int top, int right, int bottom)
    View类中布局发生改变时会调用的方法,这个方法是所有View、ViewGroup及其派生类都具有的方法,重载该类可以在布局发生改变时作定制处理,这在实现一些特效时非常有用。
  • protected void dispatchDraw(Canvas canvas)
    ViewGroup类及其派生类具有的方法,这个方法主要用于控制子View的绘制分发,重载该方法可改变子View的绘制,进而实现一些复杂的视效。
  • protected boolean drawChild(Canvas canvas, View child, long drawingTime))
    ViewGroup类及其派生类具有的方法,这个方法直接控制绘制某具体的子view,重载该方法可控制具体某个具体子View。

以上提到这些常用的View和ViewGroup我们会在接下来的文章中说到并使用,敬请关注!

你可能感兴趣的:(2.1.1 View 与 ViewGroup)