观点是什么意思?(你真的了解View吗?)
作为一名安卓开发者,我相信我会在工作中或多或少地处理定制视图。很多人提到custom View的第一反应是:“妈的,那东西太难了,修不好。去网上看看有没有类似的实现,拿着它改改。”
事实上,我们觉得很难定制视图的根本原因是我们不确定视图的基础。
在今天的文章中,我将带大家重新学习View的基础。
视图的构造函数。
1.视图(上下文)
当在Java代码中发现新的时调用。
2.视图(上下文、属性集)
在中声明时调用。xml,AttributeSet是从。xml。
<ImageView android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/icon" />
上图中的layout_width、layout_height和src在哪里?xml从何而来?它们不是由空生产的;实际上是通过
<declare-styleable name="ImageView"> <!– Sets a drawable as the content of this ImageView. –><attr name="src" format="reference|color" /></declare-styleable>
每个可声明样式的都会生成一个r . style able[name],加上每个属性的r . style able[name]_[attribute]。例如,上面的代码生成R.styleable.ImageView和R.styleable.ImageView_src
这些资源是什么?r . style able[name]是所有属性资源的数组,系统使用它来查找属性值。每个r . style able[name]_[attribute]都只是这个数组的索引,所以可以一次取出所有的属性,然后根据索引查询每个值。
xml中的属性通过构造方法以AttributeSet的形式传递给View,但通常我们不会直接使用AttributeSet。这是因为原始属性通常需要引用和应用样式。例如,如果在XML中定义style=@style/MyStyle,这个方法首先获取MyStyle,然后混合它的属性。最后,AcquisitionStyleDatAttributes返回一个TypedArray,您可以使用它来获取StyleDatAttributes值。流程简化后,如下图所示:
public ImageView(Context context, AttributeSet attrs) {TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.ImageView, 0, 0);Drawable src = ta.getDrawable(R.styleable.ImageView_src);setImageDrawable(src);ta.recycle;}
在这里,我们向获取样式属性传递了两个参数。第一个参数是AttributeSet attrs,这是xml中的属性;]第二个参数是R.styleable.ImageView数组,它告诉这个方法我们要取哪个属性,这里的意思是获取ImageView属性的值;第三和第四个参数是两个资源引用,defStyleAttr和defStyleRes,这将在第三和第四个构造方法中解释。
当我们得到TypedArray时,我们可以得到一个单一的属性。我们需要使用R.styleable.ImageView_src来正确索引数组中的src属性。
3.视图(上下文,属性集,
defStyleAttr)
DefStyleAttr参数:默认样式是指其在当前应用程序或活动使用的主题中的默认样式,它定义了该类对于某一类型视图的基本样式。如果我们不在构造函数中指定我们的自定义样式,我们将使用Andoid系统的默认控件样式,在指定时,我们需要间接传递主题,如下所示:
1.在主题(styles.xml)中设置样式。
<resources> <style name="Theme"><item name="mStyle">@style/CustomStyle</item></style><!–具体样式–><style name="CustomStyle" ><item name="android:background">@android:color/black</item></style></resource>
2、施工中采用的方法。
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.view, R.attr.mStyle, 0);
4.视图(上下文,属性集,
defStyleAttr,defStyleRes)
DefStyleRes参数:它只是一个样式资源(@style/Widget)。用于指定样式。它比defStyleAttr简单,不需要间接传递主题。在API 21中添加。因此,除非您的minSdkVersion是21,否则不要使用它。
它们是串联的,如果你叫一个,所有的都会被super叫。串联也意味着你只需要重写你需要的构造函数。通常,您只需要实现前两个(一个用于代码,一个用于XML膨胀)。
视图视图结构
对于多视图,结构为树形结构:顶层为视图组,视图组下可能有多个视图组或视图,如下图所示:
注意:无论是测量过程、布局过程还是绘制过程,测量或计算总是从View树的根节点开始(即从树的顶部开始),逐层、分支进行(即树递归)。最后,将计算整个视图树中的每个视图,并最终确定整个视图树的相关属性。
安卓坐标系
安卓的坐标系定义为:
屏幕左上角是坐标原点。
将方向增加到x轴右侧。
向下增加Y轴的方向。
见下图:
视图位置(坐标)描述)
视图的位置由四个顶点决定(如下图a、b、c和d所示)。
四个顶点的位置描述分别由四个值决定(视图的位置相对于父控件):
顶部:从子视图的上边界到父视图的上边界的距离。
左:从子视图的左边缘到父视图的左边缘的距离。
底部:从子视图的下边缘到父视图的上边缘的距离。
右侧:从子视图的右侧边界到父视图的左侧边界的距离。
视图位置获取方法。
视图的位置通过view.getxxx函数获得(以Top为例):
// 获取Top位置public final int getTop {return mTop;}// 其余如下:getLeft;//获取子View左上角距父View左侧的距离getBottom; //获取子View右下角距父View顶部的距离getRight; //获取子View右下角距父View左侧的距离
与get的区别…和getRaw…在MotionEvent中。
//get :触摸点相对于其所在组件坐标系的坐标event.getX;event.getY;//getRaw :触摸点相对于屏认坐标系的坐标event.getRawX;event.getRawY;
见下图:
安卓的角度和弧度。
角度和弧度都是描述角度的度量单位。区别如下:
默认屏幕坐标系中的角度增加方向为顺时针,与数学坐标系中的角度增加方向正好相反。