企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## view类官方文档 [TOC] ### View和Activity的区别 Activity相当于视图层中的控制层,是用来控制和管理View的,真正用来显示和处理事件的实际上是View。 * Window对象: Window对象包含了一个DecorView(实际上就是FrameLayout)-内部类 * setContentView():通过LayoutInflater.infalte()方法加载布局生成View对象并通过addView()方法添加到Window上 * ### canvas大小 创建自定义视图并覆盖它的onDraw()。 没有覆盖onMeasure()画布占据整个设备屏幕。 覆盖onMeasure(),将canvas重新调整为传递给setMeasuredDimension()的维度。 因此我们可以确保调整画布大小,并且必须在onMeasure()中完成。 ### 定义 这个类表示用户界面组件的基本构建块。视图在屏幕上占据一个矩形区域,负责绘图和事件处理。 ### 使用视图 * **设置属性**.例如设置TextView文本 。可用属性和设置它们的方法将根据视图的不同子类而有所不同。请注意,可以在XML布局文件中设置构建时已知的属性。 * **设置焦点**.框架将处理移动焦点以响应用户输入.requestFocus() * **设置侦听器**. * **设置可见性**:您可以使用隐藏或显示视图 setVisibility(int) ### 实现自定义视图 view生命周期 ![](https://img-blog.csdn.net/20150222132925155) 首先是调用了构造方法,这是不用猜都该知道的,然后呢调用了onFinishInflate方法,这个方法当xml布局中我们的View被解析完成后则会调用,具体的实现在LayoutInflater的rInflate方法中. 紧接着调用的是onAttachedToWindow方法,此时表示我们的View已被创建并添加到了窗口Window中,该方法后紧接着一般会调用onWindowVisibilityChanged方法,只要我们当前的Window窗口中View的可见状态发生改变都会被触发,这时View是被显示了. 随后就会开始调用onMeasure方法对View进行测量,如果测量结果被确定则会先调用onSizeChanged方法通知View尺寸大小发生了改变,紧跟着便会调用onLayout方法对子元素进行定位布局,然后再次调用onMeasure方法对View进行二次测量,如果测量值与上一次相同则不再调用onSizeChanged方法,接着再次调用onLayout方法,如果测量过程结束,则会调用onDraw方法绘制View。 要实现自定义视图,通常首先为框架调用所有视图的某些标准方法提供覆盖。您不需要覆盖所有这些方法。事实上,你可以从覆盖onDraw开始. #### 创建 **构造函数** ~~~ //一般在直接New一个View的时候调用 public CharView(Context context) { super(context); } //一般在layout文件中使用的时候会调用,关于它的所有属性(包括自定义属性)都会包含在attrs中传递进来。 public CharView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } ~~~ **onFinishInflate()** Activity中调用setContentView之后就会调用onFinishInflate这个方法 #### 附上 **onAttachedToWindow()** 视图附加到窗口时调用。 **onWindowVisibilityChanged(int)** 当包含视图的窗口的可见性发生更改时调用。 **onDetachedFromWindow()** 视图从其窗口分离时调用。 #### 布局 **onMeasure(int, int)** 调用以确定此视图及其所有子项的大小要求。 **onLayout(boolean, int, int, int, int)** 当此视图应为其所有子项指定大小和位置时调用。 **onSizeChanged(int, int, int, int)** 在此视图的大小发生更改时调用。 #### 绘制 **onDraw(android.graphics.Canvas)** 视图应呈现其内容时调用。 #### 事件处理 **onKeyDown(int, KeyEvent)** 用户按下一个键盘按键时. **onKeyUp(int, KeyEvent)** 弹起 **onTouchEvent(MotionEvent)** 发生触摸屏事件时调用。 #### 焦点 **onFocusChanged(boolean, int, android.graphics.Rect)** 视图获得或失去焦点时调用。 **onWindowFocusChanged(boolean)** 当包含视图的窗口获得或失去焦点时调用。 ### 标识 视图可能具有与之关联的整数id。这些ID通常在布局XML文件中分配,用于查找视图树中的特定视图。 * 在布局文件中定义一个Button,并为其分配一个唯一的ID。 * 从Activity的onCreate方法中,找到Button.findViewById 视图ID在整个树中不一定是唯一的,但最好确保它们在您正在搜索的树的部分内至少是唯一的。 ### 位置 视图的几何形状是矩形的几何形状。视图具有一个位置,表示为一对左坐标和顶坐标,以及两个维度,表示为宽度和高度。位置和尺寸的单位是像素。 top:左上角纵坐标 left:左上角横坐标 bottom:右下角纵坐标 right:右下角横坐标 ![](https://img-blog.csdn.net/20170220111655145?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSU9fRmllbGQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ### 尺寸,填充和边距 第一对称为测量宽度和 测量高度。这些维度定义了视图在其父级中的大小(有关详细信息,请参阅布局。)可以通过调用getMeasuredWidth() 和获取测量的维度getMeasuredHeight()。其实就是canvas大小 第二对简称为宽度和高度,有时也称为绘图宽度和绘图高度。这些尺寸定义了屏幕上,绘图时和布局后视图的实际大小。这些值可以但不必与测量的宽度和高度不同。宽度和高度可以通过调用getWidth()和获得 getHeight()。 ![](https://img-blog.csdn.net/20161120133312678) 填充以视图的左,上,右和底部分的像素表示。填充可用于将视图的内容偏移特定量的像素。例如,左边的填充为2会将视图的内容推到左边缘右侧2个像素。填充可以通过设置 setPadding(int, int, int, int)或setPaddingRelative(int, int, int, int) 方法通过调用和询问getPaddingLeft(),getPaddingTop(), getPaddingRight(),getPaddingBottom(),getPaddingStart(), getPaddingEnd()。 ### 布局 ### 绘制 要强制绘制视图,请调用invalidate()。 ### 事件处理和线程 invalidate() 请求重绘View树,即draw()过程。把例子中他是整个刷新着UI,并且从头到尾并不会触发onMeasure()方法(控制大小用)。如果是View就重绘View,如果是ViewGroup就全部重绘。 requestLayout() 他跟invalidate()相反,他只调用measure()和layout()过程,不会调用draw()。 滚动