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。如果动画附加到有子视图,则动画将影响由该节点根植的整个子树。当动画启动时,框架将负责重新绘制适当的视图,直到动画完成。