记录学习Android基础的心得02:视图View(常识篇)


前言

山水有相逢,相见__可期!珍惜眼前人,莫等花落去,徒留人悲戚。
作为入门Android的常识,view基类及其子类是我们接触的最多的,Android的GUI编程就是熟练使用view并了解其背后的原理。其子类按照功能可以分为两大类:基本控件类和视图容器类(布局类)。这里介绍了常识性的几个控件类:TextView(文本框),EditView(编辑框),Button(按钮),几个常识性的容器类:LinearLayout(线性布局),FrameLayout(帧布局),ConstraintLayout(约束布局),Android可以使用xml布局文件显示界面,也可以使用纯代码显示和操作界面,当二者有机结合起来时,我们能快速写出复杂的界面且高效的处理界面元素,达到事倍功半之效,其实有过GUI开发经验的人学习起来毫无压力。


一、View基类简介

该类表示用户界面组件的基本构建块。 视图占用屏幕上的矩形区域,负责绘图和事件处理。 View是小部件的基类,用于创建交互式UI组件(按钮,文本字段等)。 ViewGroup子类是布局的基类,这是不可见的容器,用于容纳其他视图(或其他视图组)并定义其布局属性。View是Android的基本视图,所有的控件和布局都是由View类直接或者间接派生的。
我们打开在线开发文档,找到view类:在这里插入图片描述
可以看到其直接或者间接的派生类有一百多个!
在这里插入图片描述
当然,我们只要按需学习即可。

看一看其内部类和接口:
Nested classes
class View.AccessibilityDelegate
这个类代表一个可以在View注册的View ,通过组合而不是继承来增强可访问性支持。

class View.BaseSavedState
派生类的基类,想要在onSaveInstanceState()保存和恢复它们自己的状态。

class View.DragShadowBuilder
创建拖放操作期间系统显示的图像。

class View.MeasureSpec
MeasureSpec封装了从父到子传递的布局需求。

interface View.OnApplyWindowInsetsListener
监听器以自定义的方式在视图上应用窗口插件。

interface View.OnAttachStateChangeListener
当该视图附加到窗口或从窗口分离时,将调用回调的接口定义。

interface View.OnClickListener
单击视图时要调用的回调的接口定义。

interface View.OnContextClickListener
在单击上下文视图时要调用的回调的接口定义。

interface View.OnCreateContextMenuListener
在构建此视图的上下文菜单时调用回调的接口定义。

interface View.OnDragListener
将拖动分派到此视图时调用回调的接口定义。

interface View.OnFocusChangeListener
当视图的焦点状态改变时调用回调的接口定义。

interface View.OnGenericMotionListener
将通用运动事件分派到此视图时调用回调的接口定义。

interface View.OnHoverListener
将悬停事件分派到此视图时要调用的回调的接口定义。

interface View.OnKeyListener
将硬件按键事件分派到此视图时调用回调的接口定义。

interface View.OnLayoutChangeListener
由于布局处理而导致视图的布局边界发生更改时调用回调的接口定义。

interface View.OnLongClickListener
当单击并保存视图时调用回调的接口定义。

interface View.OnScrollChangeListener
当视图的滚动X或Y位置改变时调用回调的接口定义。

interface View.OnSystemUiVisibilityChangeListener
在状态栏更改可见性时调用回调的接口定义。

interface View.OnTouchListener
将触摸事件分派到此视图时调用回调的接口定义。

以上加粗的接口和类是必须熟练于心的!
接着往下翻再看一看view类的xml属性:在这里插入图片描述
显然,这里的大部分属性既可以在xml文件中进行声明,而且也提供了相对应的setter/getter方法用于在java代码中操作这些属性。
通常,我们很少直接使用view基类(在UI界面上就是一个空板,没有华丽的外观),view基类主要用于自定义视图,分割线等。

二、常用控件(常识篇)

①TextView(文本框)
经查阅API文档:
public class TextView
extends View implements ViewTreeObserver.OnPreDrawListener
Known Direct Subclasses
AppCompatTextView, Button, CheckedTextView, Chronometer, DigitalClock, EditText, RowHeaderView, TextClock
可以看到这个类还是EditText(编辑框),Button(按钮)的父类。它与EditText最大的区别在于其文本内容是程序事先固定了的,不允许用户编辑文本内容。
一个文本框无非用于显示文本,顶多设置文字的显示风格或者文本框自身的外观而已,打开上一个已经创建的项目,点击进入xml布局文件编辑:
在这里插入图片描述
点击text标签栏,这里先看 标签:

  <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

xml属性:
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
见名知意,指定此控件的宽高,wrap_content:能包裹文字内容即可,match_parent:将文本框填充满父容器。

android:text
要显示的文本。必须是字符串值,使用’\;’ 转义字符如’\ n’或’\ uxxxx’作为unicode字符。这也可能是对包含此类型值的资源(形式为“ @[package:]type:name ”)

当然可以为此文本框指定唯一标识符,需要声明如下属性
android:id="@+id/tv_hello"
为此视图提供标识符名称,以便稍后使用View.findViewById()或Activity.findViewById()检索它。 这必须是资源参考; 通常您使用@+语法来设置此@+以创建新的ID资源。 例如: android:id="@+id/my_id" ,它允许您稍后使用findViewById(R.id.my_id)检索视图。

android:textAppearance
基本文字颜色,字体,大小和样式。必须是另一个资源的引用,其形式为“ @[+][package:]type:name ”

android:textColor
文字颜色。可能是另一种资源的引用,其形式为“ @[+][package:]type:name ”,可以是“ #rgb ”,“ #argb ”,“ #rrggbb ”或“ #aarrggbb ”形式的颜色值。

android:textSize
文字的大小。 对于缩放像素,文本的推荐尺寸类型是“sp”(例如:15sp)。必须是一个维度值,这是一个浮点数,后面跟着一个单位,例如“ 14.5sp ”。 可用单位为:px(像素),dp(密度独立像素),sp(基于首选字体大小的缩放像素),单位为英寸,毫米(毫米)。这也可能是对包含此类型值的资源(形式为“ @[package:]type:name ”)

android:textStyle
文字的样式(粗体,斜体,粗体)。必须是以下常量值中的一个或多个(用’|'分隔)。
Constant Value 描述
normal 0
bold 1
italic 2
以上是需要使用文字的控件的常用属性的介绍,当然,不图美观的话,直接使用默认文字属性即可(不显示声明属性)。

②EditView(编辑框)
public class EditText
extends TextView
直接在AS里随便拖一个编辑框进入约束布局里,指定对齐的约束条件:
在这里插入图片描述
查看xml中子标签:

    <EditText
        android:id="@+id/et_hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toTopOf="@+id/tv_hello"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/tv_hello" />

显然,出了多了个输入类型android:inputType的属性,其他的和文本框的属性大同小异。
③Button(按钮)
public class Button
extends TextView
代表一个按钮小部件。 用户可以按下按钮或点击按钮来执行操作。当用户单击/长按按钮时,按钮会触发onClick/onLongClick事件。可以指定属性为按钮增加背景颜色和背景图片,既可以使背景图片固定不变,也可以使背景图片根据按钮的状态进行变化(使用xml文件格式的状态图形StateListDrawable,只需要在drawable目录下右键->Drawable resource file,选择根标签为selector,指定文件名即可生成,然后往里声明不同按键状态下要显示的图片即可,如图:)
在这里插入图片描述
把按钮属性android:background设置为引用该状态图形资源的ID即可

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_state"
        android:text="Button" />

ViewGroup(视图组的基类)
查看API:
public abstract class ViewGroup
extends View implements ViewParent, ViewManager(注意也是继承自View)
内部类和接口:
class ViewGroup.LayoutParams
LayoutParams视图用来告诉他们的父容器自己想如何摆放。
class ViewGroup.MarginLayoutParams
支持边距的布局的每个子布局信息。
interface ViewGroup.OnHierarchyChangeListener
在此视图中的层次结构发生变化时调用回调的接口定义
直属的子类
AbsoluteLayout, AdapterView, CoordinatorLayout, DrawerLayout, FragmentBreadCrumbs, FrameLayout, GridLayout, LinearLayout, LinearLayoutCompat, PagerTitleStrip, RecyclerView, RelativeLayout, SlidingDrawer, SlidingPaneLayout, SwipeRefreshLayout, Toolbar, TvView, ViewPager
间接的子类
AbsListView, AbsSpinner, ActionMenuView, AdapterViewAnimator, AdapterViewFlipper, AppBarLayout, AppCompatSpinner, AppWidgetHostView, BaseCardView, BrowseFrameLayout, and 45 others.
ViewGroup是一个可包含其他视图(称为子视图)的特殊视图。视图组是布局和视图容器的基类。 该类还定义了用作布局参数基类的ViewGroup.LayoutParams类。有关布局属性,请参阅ViewGroup.LayoutParams 。
文档往后看其属性,注意一个常用的属性:
android:descendantFocusability
在查找视图以获得焦点时,定义ViewGroup及其内部控件之间的关系。必须是下列常数值之一。
Constant Value 描述
beforeDescendants 0 ViewGroup将在其任何内部控件之前获得焦点。
afterDescendants 1 只有当视图组的内部控件都不需要焦点时,它才能获得焦点。
blocksDescendants 2 ViewGroup将阻止其内部控件接收焦点
这对应于全局属性资源符号 descendantFocusability 。
在布局文件中直接使用ViewGroup很少,应使用其子类:

④LinearLayout(线性布局)
查阅API:
public class LinearLayout
extends ViewGroup
将其内部控件排列在单列或单行中的布局。 行的方向可以通过调用setOrientation()来设置。 您还可以指定gravity,通过调用setGravity()指定所有子元素的对齐方式,通过设置权重成员LinearLayout.LayoutParams来填充布局中的任何剩余空间。 默认方向是水平的。
有关布局属性,请参阅 android.widget.LinearLayout.LayoutParams

线性布局是最常用的布局,使用起来非常简单。这里我们把整个activity的根标签设置为LinearLayout,并把内部控件排列方向设置为垂直:
在这里插入图片描述
⑤FrameLayout (帧布局)
查阅API:
public class FrameLayout
extends ViewGroup
FrameLayout旨在占据屏幕上的某个区域以显示单个控件。 通常情况下,应该使用FrameLayout来保存单个子视图,因为可以很容易地组织子视图,这种方式可以根据不同的屏幕尺寸进行扩展,而不需要内部控件相互重叠。 但是,您可以通过使用android:layout_gravity属性将多个内部控件分配重力来控制他们在FrameLayout中的位置。内部控件以堆叠形式绘制,最近添加的内部控件位于顶部,FrameLayout的大小是其最大内部控件(加上填充)的大小。 仅当setConsiderGoneChildrenWhenMeasuring()设置为true时,才使用视图GONE进行大小调整。

xml属性:
android:foreground 指定前景图片
android:foregroundGravity 定义要应用于前景可绘制对象的重力
android:measureAllChildren 确定测量时是测量所有子对象还是仅测量处于可见或不可见状态的子对象

帧布局最大的特点便是内部控件可以重叠,这个特性使其可以在游戏界面,绘图界面等场景作为根布局(想一下在游戏里,操作手柄和按键是不是悬浮在游戏画面之上)。

在这里插入图片描述
显然,帧布局里的内部控件是从手机屏幕坐标原点(左上角)开始放置的,这两个TextView利用margin属性错开一定位置重叠。

⑥ConstraintLayout(约束布局)
AS的默认布局文件自动使用约束布局。
在这里插入图片描述
每个组件都可以在上下左右四个方向添加约束。约束布局可以指定子控件位于父控件的百分比处,或者是相对于其他控件的位置的具体的dp值。
我们这里看一下怎么往约束布局塞控件,比如在上面的界面中添加一个按钮,该按钮的需要如下:
按钮位于文本框下边,与文本框相差20dp。
按钮左边与文本框对齐,按钮右边比文本框右边少10db。
看看具体操作:首先向界面中拖入一个按钮,
然后从按钮左边带圆圈的点拖至文本框的左边,建立按钮左边与文本框左边对齐的约束。
然后从按钮下边带圆圈的点拖至文本框的下边,建立按钮下边与文本框下边对齐的约束。
然后从按钮右边带圆圈的点拖至文本框的右边,建立按钮右边与文本框右边对齐的约束。
上面只是控制按钮与文本框对齐,如果要精确控制按钮与文本框的相对距离,可通过AS提供的属性设置界面进行控制。选中按钮后可在AS右上角看到:在这里插入图片描述
这样就实现了上面相对布局的设置。

三、如何快速导入本地的project

不知道大家有没有用AS导入下载来的项目出现一堆红的体验
在这里插入图片描述
最烦的就是,项目构建时build一直转圈圈,一直在下载外网依赖文件,网速又慢,然而这些依赖文件在其他项目中早已经存在了。这很大程度都是gradle版本不一致的锅,众所周知,AS集成了gradle插件进行项目的管理,每当我们new project后,会自动生成两个关键文件:
gradle-wrapper.properties最后一行

//指定使用哪个gradle版本来构建project
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip

build.gradle(project)buildscript包的dependencies

classpath 'com.android.tools.build:gradle:4.1.2'//指定了当前AS集成的gradle插件版本

这里注意gradle插件版本和gradle版本的联系和区别:在这里插入图片描述
gradle插件是AS集成的,可以通过setting更新插件,而gradle插件工作需要资源包,那么这个资源包的版本就对应gradle的版本,建议直接下载gradle资源包的最新版6.8,把gradle插件更新。
1.首先创建gradle资源包的缓存目录:用AS新建一个project,将gradle-wrapper.properties最后一行的版本号改为6.8,然后sysc project,如果本地没有缓存,这时AS会自动在
C:\Users\Hasee.gradle\wrapper\dists创建一个6.8-all的缓存目录:
在这里插入图片描述
这时的AS会去自动下载这个资源包,我们把这一过程stop,关闭当前project。
2.打开6.8-all的缓存目录,删除后缀为.zip.part的不完整资源包,把头先下载的完整资源包复制进来(注意不需要解压)。
3.重新打开项目,这时AS会快速自动联网检测资源包的完整性,然后将其解压用来配置项目。
4.把别人的项目中的gradle-wrapper.properties和build.gradle(project)进行修改使其版本和缓存的版本一致,然后open project等待AS自动配置即可。

总结

1.AS的代码自动补全功能十分强大,键入关键字,按住alt+enter可以快速补全代码。
2.控件的几个属性的区别:
①带_layout前缀的用于指定当前视图在父视图中的布局,而不带前缀的用于指定其内部子视图的布局,如:android:layout_gravity(自身在父布局中的对齐方式)和android:gravity(内部视图的对齐方式)
②margin和padding属性:margin用于指定当前控件在父布局中的距离,padding指定当前控件的显示内容在当前控件的距离。
在这里插入图片描述
3.使用Toast类在手机显示提示信息,使用Log类在AS中logcat显示提示信息。

问大家一个问题:在以后的时代里,人的命运可以被预测吗?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖工人_0803号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值