翻译 整理View , API

https://developer.android.google.cn/reference/android/view/View

API 27

Annotations

ViewDebug.ExportedProperty : 在捕获视图时标记要转储的字段和方法。修饰方法时方法不能有参数,并返回有效的数据。

例如:View getContext()

  @ViewDebug.CapturedViewProperty
  public final Context getContext() {
        return mContext;
    }

ViewDebug.ExportedProperty : 此注释可用于标记视图服务器将要转储的字段和方法。只有没有参数的非空方法才能被注释。

ViewDebug.FlagToString : 定义从标志到字符串的映射。

ViewDebug.IntToString : 定义从int值到字符串的映射。

ViewDebug :View视图和view结构的调试跟踪工具。

其他注解:@Focusable 、 @Visibility 、@LayoutDir ... 

生存期都是RetentionPolicy.SOURCE,@IntDef规定取值范围。用于规范对象的属性值。


Using Views

窗口中的视图都在一个View树里。我们可以通过代码或者XML文件添加视图。

一旦创建视图树,常常需要做一些共同的操作:

    1.设置属性:比如 TextView.setText(),或者通过XML设置。

    2.设置焦点: 可以调用requestFous()。

    3.设置监听:...

     4.设置visibility: setVisitity(int);


自定义View

继承View,重写里面framework 调用的一些标准方法。

    1.Creation创建:

        Constructors 通过代码创建或inflate一个布局文件时构造方法被调用,然后解析定义属性值。

        onFinishInflate() 当View 和他所有的子View从XML文件中被inflated后被调用。

    2.Layout 布局:

        onMeadsure(init,init)   调用,以确定此视图及其所有子视图的大小要求。

        onLayout(boolean,int,int,int,int)  当父视图为其所有子视图分配大小和位置。

        onSizeChanged( int,int,int,int)当此View大小发生改变时调用。

    3.Drawing 绘制:

        onDraw(canvas) 当View呈现内容时调用。

    4.Event processing 事件设置:

        onKeyDown(int,KeyEvent)  Key按下事件发生。

        onKeyUp(int ,keyEvent)当key抬起事件发生。

        onTrackballEvent(MotionEvent)当跟踪手势事件发生时调用。

        onTouchEvent( MotionEvent ) 当有一个手势屏幕触摸的事件发生时调用。

    5.Focus 焦点:

        onFocusChanged(boolean,int ,Rect)  当View获得或失去焦点时调用。

        onWindowFousChanged(boolean) 当窗体包含的View获取或失去焦点时调用。

    6.Attaching 附上:

        onAttachedToWindow() 当view附加到window窗体时调用。

        onDetachedFromWindow() 当view视图与其窗口分离时调用。


position 位置

    view的形状是矩形。每个view都有位置,由left 和 top ,width 和 height 决定。获取方法getLeft( ) 和 getTop( ) , getWidth( ) 和 getHeight( ) 。left 与 top 当前View左上角相对于直接父布局左上角的像素。


size大小,padding内边距 和 margin外边距

    大小: width 和 height 。

    第一种宽高:测量后的宽高,决定当前view期望在父体中有多大。测量后的宽高可以通过getMeasureWidth( ) 和 getMeasureHeight( )获得(必须在onMeasure( int,int ) 存储宽高后才能有效调用)。

    第二种宽高:在屏幕上实际绘制出的大小。可能与上面测量出的结果不同。可以通过getWidth()和 getHeight( )获得(必须在onLayout(...)之后才能有效调用)。

    去测量他的尺寸,要计算view设置的内边距,用于将view的内容偏移相应的像素。 可以使用setPadding(int,int,int,int) 或 setPaddingRelative(int ,int ,int ,int)。查询通过getPaddingXxx()。

    

Layout 布局

    分为两个步骤:

    1. 测量阶段measure(int,int)。从上到下递归整个view树,父布局将规格传递到子布局,测量时每个view都setMeauredDimension()储存测量值。

    2. 布局阶段layout( ... ) 。从上到下递归,传递过程中父级负责使用计算出的值定位其所有子节点。

    测量时使用两个类表示尺寸。

        (1)View.MeasureSpec 被用于告诉父级他们想被怎样测量和定位。UNSPECIFIED : 不确定的。ECXACTLY: 父级指定精确的值,子级都要符合这个值。AT_MOST:父级经可能给与子级最大的尺寸。

        (2)基类 LayoutParams 仅描述他们的宽高期望有多大(an exact number , MATCH_PARENT , WRAP_CONTENT)。

    启动layout ,调用requestLayout( ) 。


Drawing 绘制

    父级在子级前面绘制,兄弟根据填充顺序绘制。

    view :1. 绘制背景;2. 如果必要,保存画布的图层准备“褪色”;3. 绘制自身内容;4. 绘制子级;5. 如果必要,画出“褪色”的边界并恢复图层;6. 绘制装饰(scollerBar)。

    ViewGroup 的子级View可以通过setZ()控制绘制顺序。

    控制View重新绘制调用invalidate()。


Event Handling and Threading (事件处理、线程处理)

    1.一个事件产生和分发到适当的View.View处理事件和通知所有监听。

    2.在处理事件过程中,view的边界可能需要改变,view将调用requestLayout方法。

    3.相似的如果,在处理事件过程中,view的样子需要改变,将调用invalidate()。

    4.如果其中requestLayout() 或 invalidate() 被调用。framework将测量、布局、合适的绘制


Focus Handling

    framework 将处理响应用户输入的常规焦点移动,包括view移除、隐藏或一个view可用时改变焦点。常看某个view是否有焦点 使用 isFocusable()方法 。设置是否可以获取焦点使用setFousable(boolean)。 

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

    nextFocusDown

    nextFocusLeft

    nextFocusRight

    nextFocusUp


Touch Mode 

对于具有触控能力的设备,一旦用户触摸到屏幕,该设备将进入触摸模式。从这一点开始,只有isFocusableInTouchMode()为真的视图才是可聚焦的,例如文本编辑小部件。其他可触摸的视图,如按钮,在触摸时不会集中注意力;它们只会触发单击侦听器。

每当用户按下方向键(如D-pad方向)时,视图设备将退出触摸模式,并找到要聚焦的视图,这样用户就可以恢复与用户界面的交互,而无需再次触摸屏幕。

触摸模式状态维持在Activitys之间。调用isTouchMode()以查看设备当前是否处于触摸模式。


Scolling

    framework 提供支持view移动自身的内容。scrollBy(int,int),scollTo(int,int),awakenScrollBars()


Animation

从Android3.0开始,动画视图的首选方法是使用android.动画包API。这些基于动画的类改变了View对象的实际属性,比如alpha和transationX。这种行为与基于预3.0动画的类的行为形成了对比,后者只是动画化了视图在显示上的绘制方式。特别是,ViewProperty动画类使得动画这些视图属性变得特别容易和高效。或者,您可以使用预-3.0动画类来动画视图的呈现方式。您可以使用setAnimation(Animation)或StarAnimation(Animation)将动画对象附加到视图。动画可以随着时间的推移改变视图的比例、旋转、平移和alpha。如果动画附加到有子视图,则动画将影响由该节点根植的整个子树。当动画启动时,框架将负责重新绘制适当的视图,直到动画完成。


猜你喜欢

转载自blog.csdn.net/m0_37312601/article/details/80665749
今日推荐