常规&高级UI编程 | 青训营笔记

115 阅读3分钟

这是我参与「第四届青训营」笔记创作活动的第3天

1. Android UI组件

(1) 定义:图形用户界面,UI界面由不同功能的UI组件构成

(2) 类别:输入框/按钮/文本/播放器/图片/列表组件

常规UI组件的使用

例如文本组件:

<TextView
    android.id="@+id/tv_tite"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_margin="20dp"
    android:layout_gravity="center"
    android:gravity="center"
    android:padding="10dp"
    android:text="@string/app_name"
    android:textSize="20sp"
    android:textColor="@color/colorAccent"
    android:visibility="visible"
    android:background="@color/colorPrimary" />

安卓UI组件的原点是左上角 

高级UI组件

常规UI组件大多是view,而高级UI组件大多是ViewGroup 拥有更多的功能/可俄罗斯套娃/嵌套

eg: viewGroup可以包含viewGroup和view,但view不能包含view

布局文件中声明view时,并没有指定view的位置,那单个view在UI界面中的位置怎么确定嘞:

于是我们进入下一个话题 布局:)

2. 布局

多个UI组件如何组成一个页面:大小,位置,层级

(1) LinearLayout:

按水平/垂直方向排列组件

所以子视图在垂直/水平保持对齐

适用于线性排列 (o´ω`o)

比如:

<Linear Layout xmlns: android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"> # 垂直方向排列
    
    <Edit Text
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/to"/>

    <Edit Text
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/subject"/>

    <Edit Text
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" #布局内组件大小权重1
        android:gravity="top" #把Message放在左上角
        android:hint="@string/message"/>

</Linear Layout>

layout_weight: 设置为1,表明它所分享到的长度和宽度都是最高的。如果别的组件没有设置权重,那么剩余屏幕篇幅都会分给这个小组件。

(2) RelativeLayout:

只知道与某容器/组件的相对位置

可以消除嵌套试图组并使布局层次结构保持扁平 提高性能

(3) FrameLayout:

以层级叠加方式排列组件 适用于层级排列场景

如果设置了前景图像,那么它会一直处在framelayout最上层 不会被覆盖

如果都是background,先写的会在最下面( 一层层叠起来

(4) ConstraintLayout:

比如已经做了A组件,我们设置B组件的时候 

可以让B组件的顶部和底部和A对齐 那就不用设置B的宽度啦

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:latout_height="match_parent">
    
    <ImageView
        android:id="@+id/iv_beauty"
        android:layout_width="100dp"
        android:layout_height="200dp"
        android:scaleType="centerCorp"
        android:src="@drawable/beauty"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
        #所以这个image会出现在屏幕左上角qvq

</android.support.constraint.ConstraintLayout>

3. 渲染

流程:布局加载-》解析-》渲染

布局加载:

(1) 编写布局文件 (layout是什么样子的 如↑)

(2) 注册Manifest

(3) 设置布局文件

4.交互

(1) 定义: 将触摸事件传递到某个具体view & 处理的整个过程

(2) 解决的问题:触摸事件由哪个对象发出、经过哪些对象、最终到达哪个对象

(3) view的交互

第一步:获取view实例

第二步:添加相应监听器

@Override
protected void onCreate(Bundle savedInstanceState)}{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    //通过findViewById来获取View实例
    Button button=findViewById(R.id.btn)

    //给按钮设置点击事件监听器
    //用匿名内部类实现点击时间监听器对象
    button.setOnClick(new View.onClickListner(){
        @Override
        public void onClick(View v){
            Toast.makeText(MainActivity.this,"出发按钮点击事件", Toast.LENGTH_SHORT).show();
        }
    });
}

常用交互事件监听器

触摸事件-MotionEvent

当用户触摸屏幕的时候,系统将建立一系列的motionevent对象,motionevent包含关于发生触摸的位置和时间等信息,motionevent对象被传递到相应的捕获函数中,比如onTouchEvent()

比如在一个button上 既设置了onClick 又设置了onLongClick 有没有可能两个事件被同时相应:

答:不会同时执行喵

-> 在onTouchEvent()的ACTION_DOWN设置了一个延时Runnable,用于处理onLongClickListner

-> 在onTouchEvent()的ACTION_UP中,判断onLongClick是否执行,未执行则移除,然后执行onClickListner

onClickListner是有时间限制的 到了时间会去做执行 

(4) 事件分发

顺序:Activity->ViewGroup->View

核心方法: dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent

5. 动画

常见动画:帧动画/补间动画/属性动画

帧动画

补间动画

帧动画和补间动画缺点

- 作用对象局限 只能作用于view

- 只能改变view的视觉效果 不能改变view的属性

eg: view从A区域通过补间动画平移至B,点B区域的view是没有效果的,补间动画只是将view绘制在B区域,改变了视觉效果,实际上view还是在A取悦

- 动画效果单一

eg: 帧动画只能实现类似gif的效果,补间动画只能实现透明度/旋转/修改和平移四种动画效果

6. 自定义UI