android.View.View(即View)类是以矩形的方式显示在屏幕上,View是用户界面控件的基础。View的继承层次关系如下图:
可以看到所有的界面控件都是View的子类。简单证实一下,每当你用findViewByIds(R.id.xx)时总要将其强转,因为该方法返回的是一个View实例,有木有!!!其中不得不提View的subClass ViewGroup。Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的。所有View的子类成为”Widget”,所有ViewGroup的子类成为”Layout”。View和ViewGroup之间采用了组合设计模式,可以使得“部分-整体”同等对待。ViewGroup作为布局容器类的最上层,布局容器里面又可以有View和ViewGroup。通过这种方式,我们获得了UI界面的组合方式。
ViewGroup的子类用不同的方式来管理容器中View控件的摆放位置以及显示方式;但是,对于view控件具体摆放到什么位置,以及大小等属性则需要每个布局类的内部类LayoutParams来进行处理,该类是ViewGroup的内部类,有该类的子类具体实现LayoutParams类。
可以看到android中所有的UI控件都是View的子类,所以你可以通过继承View类来实现自定义控件,例如之前博客中提到的圆形进度条就是一个例子。注意。此时你需要重载View的构造函数。View的构造函数有三个,但常用的是第一个和第二个,比较简单,有需要的可以查下文档。
一.而动态创建View和ViewGroup一般有以下2种方式可以实现。
1.每创建一个UI控件就添加到布局中,但是这种方式有个缺点,当你要动态添加的按钮过多时,就会显得过于麻烦。
ViewParent viewParent = this.findViewById(R.id.text1).getParent();
RelativeLayout relativeLayout = (RelativeLayout) viewParent;
Button button = new Button(this);
button.setText("Fuck");
relativeLayout.addView(button,300,200);button,100,100);
2.从一个XML文件中创建控件,再添加到布局中。
LayoutInflater layoutInflater = this.getLayoutInflater();
layoutInflater.inflate(R.layout.mybviewlayout, (ViewGroup)this.findViewById(R.layout.activity_main));
在第二句代码中关联了一个布局文件mybviewlayout.xml,在这里使用inflate方法将这个布局文件装载到内存中后被转化为View对象,,然后将这个View对象添加到activity_main.xml布局文件中。
二.常用布局
1.LinearLayout
相信大家对LinearLayout一定不会陌生吧,这里有一点需要注意:Linearlayout 不允许精准的控制它子view的关系,子view只能简单的一个接一个排成行。更好的方法是使用relativelayout.
2.RelativeLayout
该布局下我们可以非常灵活的来控制UI控件的摆放位置,在现实生活中我们最常用的应该是就是RelativeLayout与LinearLayout的结合使用了吧。这里就需要注意一下view的各种layout_XXX,margin_XX,等属性的使用了,他会帮你定制非常灵活的布局文件。我会在文章末尾附上。
3.TableLayout
TableLayout是用表格来进行UI界面的布局,个人感觉不太常用,使用的标签是,而且TableLayout的属性是垂直排列,若想水平排列则应该使用TableRow。其他就不过多介绍了。
4.FrameLayout和AbsoluteLayout
FrameLayout和AbsoluteLayout分别是框架布局和绝对布局。frameLayout中UI控件默认显示在屏幕左上角,我记得Web浏览器中也是这样的,可用于图片扩散展示之类的。而AbsoluteLayout的用途相比看看名称就知道了,就我个人而言,目前并未使用到。
最后,就附上一些常用属性的说明吧,希望对大家有用。
android:alpha 关联方法: setAlpha(float) 属性说明: 视图透明度,值在0-1之间。0为完全透明,1为完全不透明。
android:background 关联方法: setBackgroundResource(int) 属性说明: 视图背景
android:clickable 关联方法: setClickable(boolean) 属性说明: 视图是否可点击
android:contentDescription 关联方法: setContentDescription(CharSequence) 属性说明: 设置View的备注说明,作为一种辅助功能提供,为一些没有文字描述的View提供说明
android:drawingCacheQuality 关联方法: setDrawingCacheQuality(int) 属性说明: "设置绘图时半透明质量。有可以取以下3个值 auto——默认,由框架决定 high——高质量,使用较高的颜色深度,消耗更多的内存 low——低质量,使用较低的颜色深度,但是用更少的内存"
android:duplicateParentState 关联方法: 属性说明: 如果设置此属性,将直接从父容器中获取绘图状态(光标,按下等)
android:fadeScrollbars 关联方法: setScrollbarFadingEnabled(boolean) 属性说明: 定义在ScrollBar没有使用时,是否褪色。
android:fadingEdgeLength 关联方法: getVerticalFadingEdgeLength() 属性说明: 设置边框渐变的长度。
android:filterTouchesWhenObscured 关联方法: setFilterTouchesWhenObscured(boolean) 属性说明: view所在窗口被其它可见窗口遮住时,是否过滤触摸事件。
android:fitsSystemWindows 关联方法: setFitsSystemWindows(boolean) 属性说明: 设置布局调整时是否考虑系统窗口(如状态栏)
android:focusable 关联方法: setFocusable(boolean) 属性说明: 设置是否获得焦点。若有requestFocus()被调用时,后者优先处理。注意在表单中想设置某一个如EditText获取焦点,光设置这个是不行的,需要将这个EditText前面的focusable都设置为false才行。在Touch模式下获取焦点需要设置focusableInTouchMode为true。
android:focusableInTouchMode 关联方法: setFocusableInTouchMode(boolean) 属性说明: 设置在Touch模式下View是否能取得焦点。
android:hapticFeedbackEnabled 关联方法: setHapticFeedbackEnabled(boolean) 属性说明: 是否启用触摸反馈,启用后就是在点击等操作时会有震动等反馈效果
android:id 关联方法: setId(int) 属性说明: 给当前View设置一个在当前layout.xml中的唯一编号,可以通过调用View.findViewById() 或Activity.findViewById()根据这个编号查找到对应的View。不同的layout.xml之间定义相同的id不会冲突。
android:importantForAccessibility 关联方法: setImportantForAccessibility(int) 属性说明: 设置可达性的重要性
android:isScrollContainer 关联方法: setScrollContainer(boolean) 属性说明: 设置当前View为滚动容器。这里没有测试出效果来,ListView/ GridView/ ScrollView根本就不用设置这个属性,而EdidText设置android:scrollbars也能出滚动条
android:keepScreenOn 关联方法: setKeepScreenOn(boolean) 属性说明: 视图在可见的情况下是否保持唤醒状态。
android:layerType 关联方法: setLayerType(int,Paint) 属性说明: "设置指定层的类型,可以取以下3个值: none——不指定 software——软件层。 hardware——硬件层。使用硬件加速。"
android:layoutDirection 关联方法: setLayoutDirection(int) 属性说明: 定义布局图纸的方向
android:longClickable 关联方法: setLongClickable(boolean) 属性说明: 是否响应长点击事件
android:minHeight 关联方法: setMinimumHeight(int) 属性说明: 设置视图最小高度
android:minWidth 关联方法: setMinimumWidth(int) 属性说明: 设置视图最小宽度
android:nextFocusDown 关联方法: setNextFocusDownId(int) 属性说明: 向下移动焦点时,下一个获取焦点的view的id
android:nextFocusForward 关联方法: setNextFocusForwardId(int) 属性说明: 下一个获取焦点的view的id
android:nextFocusLeft 关联方法: setNextFocusLeftId(int) 属性说明: 向左移动焦点时,下一个获取焦点的view的id
android:nextFocusRight 关联方法: setNextFocusRightId(int) 属性说明: 向右移动焦点时,下一个获取焦点的view的id
android:nextFocusUp 关联方法: setNextFocusUpId(int) 属性说明: 向上移动焦点时,下一个获取焦点的view的id
android:onClick 关联方法: 属性说明: 点击时,要调用的方法的名称。
android:padding 关联方法: setPaddingRelative(int,int,int,int) 属性说明: 设置上下左右的边距
android:paddingBottom 关联方法: setPaddingRelative(int,int,int,int) 属性说明: 下边距
android:paddingEnd 关联方法: setPaddingRelative(int,int,int,int) 属性说明: 与android:paddingRight相同
android:paddingLeft 关联方法: setPadding(int,int,int,int) 属性说明: 左边距
android:paddingRight 关联方法: setPadding(int,int,int,int) 属性说明: 右边距
android:paddingStart 关联方法: setPaddingRelative(int,int,int,int) 属性说明: android:paddingLeft相同
android:paddingTop 关联方法: setPaddingRelative(int,int,int,int) 属性说明: 上边距
android:requiresFadingEdge 关联方法: setVerticalFadingEdgeEnabled(boolean) 属性说明: 定义滚动时边缘是否褪色
android:rotation 关联方法: setRotation(float) 属性说明: 旋转度数
android:rotationX 关联方法: setRotationX(float) 属性说明: 水平旋转度数
android:rotationY 关联方法: setRotationY(float) 属性说明: 竖直旋转度数
android:saveEnabled 关联方法: setSaveEnabled(boolean) 属性说明: 在配置改变等情况出现时是否保存view的状态数据。如果你的view有id,那默认系统就会帮你保存。
android:scaleX 关联方法: setScaleX(float) 属性说明: 水平方向缩放比例
android:scaleY 关联方法: setScaleY(float) 属性说明: 竖直方向缩放比例