这是我参与「第四届青训营」笔记创作活动的第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的效果,补间动画只能实现透明度/旋转/修改和平移四种动画效果