view是什么意思(你真的认识View吗?)

观点是什么意思?(你真的了解View吗?)

作为一名安卓开发者,我相信我会在工作中或多或少地处理定制视图。很多人提到custom View的第一反应是:“妈的,那东西太难了,修不好。去网上看看有没有类似的实现,拿着它改改。”

事实上,我们觉得很难定制视图的根本原因是我们不确定视图的基础。

在今天的文章中,我将带大家重新学习View的基础。

视图的构造函数。

1.视图(上下文)

当在Java代码中发现新的时调用。

2.视图(上下文、属性集)

在中声明时调用。xml,AttributeSet是从。xml。

<ImageView android:layout_width="wrap_content"android:layout_height="wrap_content"android:src=&quot;@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;

见下图:

安卓的角度和弧度。

角度和弧度都是描述角度的度量单位。区别如下:

默认屏幕坐标系中的角度增加方向为顺时针,与数学坐标系中的角度增加方向正好相反。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平