Android-View详解

Posted 帅次

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android-View详解相关的知识,希望对你有一定的参考价值。

android的绝大部分UI组件都放在android.widget包及其子包、android,view包及其子包中,Android应用的所有UI组件(如TextView、Button等)都继承了View类。

View类还有一个重要的子类:ViewGroup,但ViewGroup通常作为其他组件的容器使用。

Android的所有UI组件都是建立在View、ViewGroup基础之上的,Android采用了“组合器”设计模式来设计View和ViewGroup:ViewGroup是View的子类,因此ViewGroup也可被当成View使用,对于一个Android应用的图形用户界面来说,ViewGroup作为容器来生盛装其他组件,而ViewGroup里除了可以包含普通View组件之外,还可以再次包含ViewGroup组件。

 

Android提供了两种方式来控制组件的行为:

1、在XML布局文件中通过XML属性进行控制

2、在Java或Kotlin代码中通过调用方法进行控制。

实际上不管使用那种方式,他们控制Android用户界面行为的本质是完全一样的。大部分时候,控制UI组件的XML属性还有对应的方法。

对于View类而言,它是所有UI组件的基类,因此它包含的XML属性和方法是所有组件都可以使用的。

1、自定义View

package com.scc.demo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.Nullable;
/**
  * 创建人:scc
  * 功能描述:自定义View
  */
class CustomView extends View {
    //从代码创建视图时使用的简单构造函数。
    public CustomView(Context context) {
        super(context);
    }
    //从XML扩充视图时调用的构造函数。
    public CustomView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    //从XML执行inflation并从主题属性应用特定于类的基本样式。(很少用)
    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    //从XML执行inflation并从主题属性或样式资源应用特定于类的基本样式。(很少用)
    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    //调用以确定此视图及其所有子视图的大小要求。(布局)
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    //当此视图应为其所有子项分配大小和位置时调用。(布局)
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }
    //当此视图的大小发生变化时调用。(布局)
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }
    //当视图应该呈现其内容时调用。(画画)
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }
    //当发生新的硬件键事件时调用。(事件处理)
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return super.onKeyDown(keyCode, event);
    }
    //发生硬件键启动事件时调用。(事件处理)
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        return super.onKeyUp(keyCode, event);
    }
    //当轨迹球运动事件发生时调用。(事件处理)
    @Override
    public boolean onTrackballEvent(MotionEvent event) {
        return super.onTrackballEvent(event);
    }
    //当触摸屏运动事件发生时调用。(事件处理)
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return super.onTouchEvent(event);
    }

    //当视图获得或失去焦点时调用。(重点)
    @Override
    protected void onFocusChanged(boolean gainFocus, int direction, @Nullable Rect previouslyFocusedRect) {
        super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
    }
    //当包含视图的窗口获得或失去焦点时调用。(重点)
    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
    }
    //当视图与其窗口分离时调用。
    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    }

    //当视图附加到窗口时调用。
    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
    }
    //onWindowVisibilityChanged
    @Override
    protected void onWindowVisibilityChanged(int visibility) {
        super.onWindowVisibilityChanged(visibility);
    }

    //在视图及其所有子项从XML之后调用。
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
    }
}

2、在布局 XML 文件中使用View

<!--android:id控件ID,在同一个layout.xml里要保持唯一-->
<!--android:layout_width控件宽度-->
<!--android:layout_height控件高度-->
<!--android:background背景颜色-->

<View
    android:id="@+id/view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/color_ff0000"/>

例子中仅用了几个属性文章最后有XML属性表以及相关方法说明仅供借鉴。加油

3、View宽度和高度的大小。对于每个维度,它可以指定以下之一:

a、确切的数字

b、MATCH_PARENT,这意味着视图希望与其父视图一样大(减去填充)

c、WRAP_CONTENT,这意味着视图希望足够大以包含其内容(加上填充)。

4、事件处理和线程

一个视图的基本循环如下:

a、一个事件进来并被分派到适当的视图。视图处理事件并通知所有侦听器。

b、如果在处理事件的过程中,视图的边界可能需要改变,视图将调用requestLayout().

c、同样,如果在处理事件的过程中可能需要更改视图的外观,则视图将调用invalidate().

d、如果调用requestLayout()或invalidate()中的任何一个,框架将负责测量、布局和适当地绘制树。

注意:整个视图树是单线程的。在任何视图上调用任何方法时,您必须始终在 UI 线程上。 如果您正在其他线程上工作并希望从该线程更新视图的状态,则应使用Handler.

5、焦点处理

该框架将根据用户输入处理常规焦点移动。这包括在视图被移除或隐藏时,或在新视图可用时更改焦点。观点表明他们愿意通过该isFocusable()方法集中注意力。要更改视图是否可以获取焦点,请调用setFocusable(boolean)。当处于触摸模式时(请参阅下面的注释),视图指示他们是否仍然希望通过 聚焦,isFocusableInTouchMode() 并且可以通过来改变它setFocusableInTouchMode(boolean)。

焦点移动基于一种算法,该算法在给定方向上找到最近的邻居。在极少数情况下,默认算法可能与开发人员的预期行为不匹配。在这些情况下,您可以通过在布局文件中使用这些 XML 属性来提供显式覆盖:

 nextFocusDown

 nextFocusLeft

 nextFocusRight

 nextFocusUp

要获得特定视图的焦点,请调用requestFocus()。

6、触控模式

当用户通过方向键(例如方向键)导航用户界面时,有必要将焦点放在可操作的项目(例如按钮)上,以便用户可以看到将要输入的内容。但是,如果设备具有触摸功能,并且用户通过触摸开始与界面交互,则不再需要始终突出显示或关注特定视图。这激发了一种名为“触摸模式”的交互模式。

对于具有触摸功能的设备,一旦用户触摸屏幕,设备将进入触摸模式。从这一点开始,只有isFocusableInTouchMode()为 true 的视图 才是可聚焦的,例如文本编辑小部件。其他可触摸的视图,如按钮,在触摸时不会获得焦点;他们只会触发点击监听器。

任何时候用户点击方向键,例如方向键,视图设备都会退出触摸模式,并找到一个视图来获取焦点,这样用户就可以在不再次触摸屏幕的情况下恢复与用户界面的交互。

触摸模式状态跨Activitys保持。调用 isInTouchMode()以查看设备当前是否处于触摸模式。

7、滚动

该框架为希望在内部滚动其内容的视图提供基本支持。这包括跟踪 X 和 Y 滚动偏移以及绘制滚动条的机制。如: scrollBy(int, int)、scrollTo(int, int)和 awakenScrollBars()。

8、标签

与 ID 不同,标签不用于标识视图。标签本质上是一条可以与视图相关联的额外信息。它们最常用于在视图本身中存储与视图相关的数据,而不是将它们放在单独的结构中。

可以使用布局 XML 中的字符序列值将标签指定为使用android:tag 属性的单个标签或使用<tag>子元素的多个标签:

也可以使用setTag(java.lang.Object)或使用代码中的任意对象指定标签 setTag(int, java.lang.Object)。

9、特性

View 类公开一个ALPHA属性,以及几个与转换相关的属性,例如TRANSLATION_X和TRANSLATION_Y。这些属性既可以在Property表单中使用,也可以在名称相似的 setter/getter 方法中使用(例如setAlpha(float)for ALPHA)。这些属性可用于设置与视图上的这些渲染相关属性相关联的持久状态。这些属性和方法也可以与Animator基于动画的动画结合使用 。

View的XML属性和相关方法说明

XML属性

相关方法

说明

android:alpha

setAlpha(float)

设置该组件的透明度

android:background

setBackgroundResource(int)

设置该组件的背景颜色

android:backgroundTint

setBackgroundTintList

(ColorStateList)

设置对背景颜色重新着色,该属性要

与android:background结合使用

android:backgroundTintMode

setBackgroundTintMode

(PorterDuff.Mode)

设置对背景颜色着色的模式,该属性

支持PorterDuff.Mode的各枚举值

android:clickable

setClickable(boolean)

设置该组件是否可以激发单击事件

android:contentDescription

setContentDescription

(CharSequence)

设置该组件的内容描述信息

android:contextClickable

setContextClickable(boolean)

设置该属性是否可以激发context单

击事件

android:drawingCacheQuality

setDrawingCacheQuality(int)

设置该组件所使用的绘制缓存的质量

android:elevation

setElevation(float)

设置该组件“浮”起来的高度,通过

设置该属性可让该组件呈现3D效果

android:fadeScrollbars

setScrollbarFadingEnabled

(boolean)

设置当不使用该组件的滚动条时,是否

淡出显示滚动条 

android:fadingEdgeLength

getVerticalFadingEdgeLength()

设置淡出边界的长度

android:filterTouchesWhenObscured

setFilterTouchesWhenObscured

(boolean)

设置当该组件所在的窗口被其他窗口

遮挡时,是否过滤触摸事件

android:fitsSystemWindows

setFitsSystemWindows(boolean)

设置是否基于系统窗口(如状态栏)

来调整视图布局 

android:focusable

setFocusable(boolean)

设置该组件是否可以得到焦点

android:focueableInTouchMode

setFocusableInTouchMode

(boolean)

设置该组件在触摸模式下是否可以得到

焦点

android:foreground

setForeground(Drawable)

设置绘制到组件内容上面的Drawable 

android:foregroundGravity

setForegroundGravity(int)

设置绘制前景Drawable时的对齐方式

android:foregroundTint

setForegroundTintList(ColorStateList)

设置对前景Drawable重新着色

android:foregroundTintMode

setForegroundTintMode

(PorterDuff.Mode)

设置对前景Drawable着色的模式

android:hapticFeedbackEnabled

setHapticFeedbackEnabled(boolean)

设置该组件是否能对诸如长按这样的事件

启用触觉反馈

android:id

setId(int)

设置该组件的唯一标识。在Java代码中

可通过findViewById来获取它 

android:isScrollContainer

setScrollContainer(boolean)

设置该组件是否作为可滚动容器使用 

android:keepScreenOn

setKeepScreenOn(boolean)

设置该组件是否会强制手机屏幕一直打开 

android:layerType

setLayerType(int,Paint) 

设置该组件使用的图层类型 

android:layoutDirection

setLayoutDirection(int) 

设置该组件的布局方式。该属性支持

ltr(从左到右)、rtl(从右到左)、inherit

(与父容器相同)和locale四种值 

android:longClickable

setLongClickable(boolean) 

设置该组件是否可以响应长单击事件 

android:minHeight

setMinimumHeight(int) 

设置该组件的最小高度 

android:minWidth

setMinimumWidth(int) 

设置该组件的最小宽度 

android:nextFocusDown

setNextFocusDownId(int) 

设置焦点在该组件上,且单击向下键时获得

焦点的组件ID 

android:nextFocusForward

setNextFocusForwardId(int) 

设置焦点在该组件上,且单击向前键时获得

焦点的组件ID 

android:nextFocusLeft

setNextFocusLeftId(int)

设置焦点在该组件上,且单击向左键时获得

焦点的组件ID 

android:nextFocusRight

setNextFocusRightId(int)

设置焦点在该组件上,且单击向右键时获得

焦点的组件ID 

android:nextFocusUp

setNextFocusUpId(int)

设置焦点在该组件上,且单击向上键时获得

焦点的组件ID 

android:onClick

 

为该组件的单击事件绑定监听器

android:padding

setPadding(int,int,int,int)

在组件的四边设置填充区域

android:paddingBottom

setPadding(int,int,int,int)

在组件的下边设置填充区域

android:paddingEnd

setPaddingRelative(int,int,int,int) 

相对布局时,在组件结尾处设置填充区域 

android:paddingHorizontal

setPaddingRelative

(int,int,int,int) 

在组件的左、右两边设置填充区域 

android:paddingLeft

setPadding(int,int,int,int)

在组件的左边设置填充区域 

android:paddingRight

setPadding(int,int,int,int) 

在组件的右边设置填充区域 

android:paddingStart

setPaddingRelative

(int,int,int,int) 

相对布局时,在组件起始处设置填充区域 

android:paddingTop

setPadding(int,int,int,int) 

在组件的上边设置填充区域 

android:paddingVertical

setPadding(int,int,int,int) 

在组件的上、下两边设置填充区域 

android:rotation

setRotation(float)

设置该组件的旋转的角度 

android:rotationX

setRotationX(float) 

设置该组件绕X轴旋转的角度 

android:rotationY

setRotationY(float) 

设置该组件绕Y轴旋转的角度 

android:saveEnabled

setSaveEnabled(boolean)

如果设置为false,那么当该组件被冻结时

不会保存它的状态 

android:scaleX

setScaleX(float)

设置该组件在水平方向的缩放比

android:scaleY

setScaleY(float) 

设置该组件在垂直方向的缩放比 

android:scrollIndicators

setScrollIndicators(int) 

设置组件滚动时显示哪些滚动条,默认值

是“top|bottom”,即上、下显示 

android:scrollX

 

该组件初始化后的水平滚动偏移 

android:scrollY

 

该组件初始化后的垂直滚动偏移 

android:

scrollbarAlwaysDraw

HorizontalTrack

 

设置该组件是否总是显示水平滚动条的

轨道 

android:

scrollbarAlwaysDrawVerticalTrack

 

设置该组件是否总是显示垂直滚动条的

轨道 

android:

scrollbarDefaultDelayBeforeFade

setScrollBarDefaultDelayBeforeFade

(int) 

设置滚动条在淡出隐藏之前延迟多少毫秒

android:scrollbarSize

setScrollBarSize(int) 

设置垂直滚动条的宽度和水平滚动条的高度 

android:scrollbarStyle

setScrollBarStyle(int) 

设置滚动条的风格和位置。该属性支持如下

属性值:

  1.insideOverlay

  2.insideInset

  3.outsideOverlay

  4.outsideInset 

android:

scrollbarThumbHorizontal

 

设置该组件的水平滚动条的滑块对应的

Drawable对象

android:

scrollbarThumbVertical

 

设置该组件的垂直滚动条的滑块对应的

Drawable对象

android:

scrollbarTrackHorizontal

 

设置该组件的水平滚动条的轨道对应的

Drawable对象

android:

scrollbarTrackVertical

 

设置该组件的垂直滚动条的轨道对应的

Drawable对象

android:scrollbars

 

定义该组件滚动时显示几个滚动条。

该属性支持如下属性值:

  1.none:不显示滚动条

  2.horizontal:显示水平滚动条

  3.vertical:显示垂直滚动条

android:

soundEffectsEnabled

setSoundEffectsEnabled

(boolean) 

设置该组件被单击时是否使用音效

android:tag

 

为该组件设置一个字符串类型的tag值。

接下来可通过View的getTag()获取该

字符串,或通过findViewWithTag()

查找该组件 

android:textAlignment

setTextAlignment(int) 

设置组件内文字的对齐方式

android:textDirection

setTextDirection(int) 

设置组件内文字的排列方式 

android:theme

 

设置该组件的主题 

android:transformPivotX

setPivotX(float) 

设置该组件旋转时旋转中心的X坐标 

android:transformPivotY

setPivotY(float) 

设置该组件旋转时旋转中心的Y坐标 

android:transitionName

 

为该View指定名字以便Transition能够

识别它

android:translationX

setTranslationX(float)

设置该组件在X方向上的位移 

android:translationY

setTranslationY(float) 

设置该组件在Y方向上的位移

android:translationZ

setTranslationZ(float) 

设置该组件在Z方向(垂直屏幕方向)上的位移 

android:visibility

setVisibility(int)

设置该组件是否可见 

 

以上是关于Android-View详解的主要内容,如果未能解决你的问题,请参考以下文章

Android-View的绘制

Android-View是否可见设置

Android-View是否可见设置

(转) Java中的负数及基本类型的转型详解

详解Android WebView加载html片段

Android-View的绘制源码学习总结