android View 详解

本文详细探讨了Android中的View类,它是所有界面控件的基础,包括View的继承结构、ViewGroup与Widget的关系、布局管理以及常用属性。重点讲述了动态创建View和ViewGroup的两种方法,并列举了多种布局的特性,如LinearLayout、RelativeLayout和TableLayout。此外,还介绍了常用View属性,如透明度、背景、点击事件和布局参数等,为理解和自定义Android UI提供了深入理解。
摘要由CSDN通过智能技术生成

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) 属性说明: 竖直方向缩放比例

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值