1.程序目录介绍
程序目录介绍.png
2.Activity类
Activity是一个应用组件,用户可与其提供的屏幕进行交互。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。
一个应用通常由多个彼此松散联系的 Activity 组成。 一般会指定应用中的某个 Activity 为“主”Activity,即首次启动应用时呈现给用户的那个 Activity。
Android里面大部分的控件都会提供很多方法,这些方法只需要自己去重写,不需要自己调用。
Activity 实际就是一个界面,管理一个界面从创建,运行到结束的整个过程 / 生命周期。
2.1Activity的生命周期图
Activity的状态转换.png
2.2Activity生命周期的回调方法
- onCreate()
这个方法是系统调用的,首次创建 Activity 时调用,始终后接 onStart()。
- onStart()
在 Activity 即将对用户可见之前调用。
如果 Activity 转入前台,则后接 onResume(),如果 Activity 转入隐藏状态,则后接 onStop()。
- onResume()
在 Activity 即将开始与用户进行交互之前调用。
此时,Activity 处于 Activity 堆栈的顶层,并具有用户输入焦点。始终后接 onPause()。
- onPause()
当系统即将开始继续另一个 Activity 时调用。
此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗 CPU 的内容,诸如此类。
它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行。
如果 Activity 返回前台,则后接 onResume(),如果 Activity 转入对用户不可见状态,则后接onStop()。
- onStop()
在 Activity 对用户不再可见时调用。
如果 Activity 被销毁,或另一个 Activity(一个现有 Activity 或新 Activity)继续执行并将其覆盖,就可能发生这种情况。
如果 Activity 恢复与用户的交互,则后接 onRestart(),如果 Activity 被销毁,则后接onDestroy()。
- onDestroy()
在 Activity 被销毁前调用。这是 Activity 将收到的最后调用。
当 Activity 结束(有人对 Activity 调用了 finish()),或系统为节省空间而暂时销毁该 Activity 实例时,可能会调用它。 可以通过 isFinishing() 方法区分这两种情形。
- onRestart()
在 Activity 已停止并即将再次启动前调用。始终后接 onStart()。
2.3Activity的这些方法在一些情况的调用
界面启动:
onCreate()
onStart()
onResume()点击home键,回到主界面:
onPause()通过后台重新运行这个程序:
onRestart()
onStart()
onResume()使用返回键,返回到主界面:
onPause()
onDestroy()
3.界面布局方式
3.1. xml配置
默认一个Activity对应一个xml配置文件。
xml配置文件命名特点:activity_界面功能.xml。
xml文件就是一个容器:可以放很多UI控件的容器。
当有很多控件时该如何布局?布局方法:
1.约束布局 ConstraintLayout
2.线性布局 LinearLayout 垂直 水平
3.相对布局 RelativeLayout
4.帧布局 FrameLayout
5.表格布局 TableLayout GridLayout
6.绝对布局 AbsoluteLayout
XML布局的常见属性
xml布局属性.png
3.2. 使用Java代码创建
通过代码来布局界面:
<1>.使用帧布局方式FrameLayout,在xml布局文件类里面将布局方式改为FrameLayout,并在容器资源里添加一个id号,以便通过id号找到这个容器资源
<2>.在app->java->MainActivity文件里面进行代码布局
1.找一个容器
2.创建一个子视图
3.设置当前这个界面的内容视图为这个容器
3.3什么时候需要用代码创建?什么时候使用xml配置?
如果添加的控件是静态的(变化的东西不多),选择xml配置。xml布局控件间耦和性更低,布局更方便,安卓开发里面经常使用。
如果需要灵活地操作这个控件 ,选择代码创建。
4.控件
控件是指对数据和方法的封装。一个控件就是一个类的具体对象。
控件可以有自己的属性和方法,其中属性是控件数据的简单访问者,方法则是控件的一些简单而可见的功能、控件创建过程包括设计、开发、调试(就是所谓的3Ds开发流程,即Design、Develop、Debug)工作, 然后是控件的使用。
因为控件是可见的,一个控件就相当于一个视图。对控件的学习分为两个阶段:基础阶段和高级阶段。
基础阶段主要是学习系统自带的控件,对系统控件要比较熟悉运用,系统自带的控件有 TextView,EditText,Button,ImageView,ListView,RecycleView,ScrollView,ViewPager,ProgressBa,Switch等。
高级阶段主要是学习自定义控件。包括在已有的控件基础上加上自己的功能,学会自己自己画或者设置一个控件。
4.1父视图与子视图
将一个控件添加到一个容器中,控件就是这个容器的子视图,容器就是这个控件的父视图。
4.2控件的尺寸设置
- match_parent 和父视图一样大
- wrap_content 包裹内容,和控件的内容一样大
- 自己写一个具体尺寸,例如20dp。(dp为单位)
控件尺寸单位
- dp (dip): 即设备无关像素(device independent pixels),这种尺寸单位在不同设备上的物理大小相同。
- px:即像素(pixel)。
- pt:通常用来作为字体的尺寸单位,1 pt相当于1/72英寸。
- inch:英寸,1 英寸约等于2.54厘米,主要用来描述手机屏幕的大小。
- sp:通常用作字体的尺寸单位,实际大小还与具体设备上的用户设定有关。
5.Demo:
使用图片布局,在图片上滑动可以改变图片像素。
1.创建两张图片视图的控件
在res->layout->activity_main.xml 的文件里面布局,其中图片放在res->drawable文件里面。
//设置背景图片
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/bg"/>
//设置前景图片
<ImageView
android:id="@+id/iv_foreground"
android:layout_width="match_parent"
android:layout_height="match_parent" />
上面通过id号可以唯一标识某一个控件或者组件(容器):android:id="@+id/iv_foreground"
2. 下面在app->java->MainActivity文件里面配置界面,找到图片视图的控件:
//配置界面
setContentView(R.layout.activity_main);
//找到容器里面的图片视图控件
foreground = findViewById(R.id.iv_foreground);
3.读取原图,将需要操作的图片读取出来
decodeResource 从工程的资源路径中去生成一张位图
getResource() 获取工程的资源
R.drawable.fr 访问资源路径下 drawable里面的一个文件名为fr的图片
//将需要操作的图片读取出来
//decodeResource 从工程的资源路径中去生成一张位图
//getResource() 获取工程的资源
//R.drawable.fr 访问资源路径下 drawable里面的一个文件名为fr的图片
orgBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.fr);
4.创建副本
操作这张图片实际就是用透明色去替换某个位置的颜色,但是不能操作原图,只能copy一份,创建一个和原始图片相同环境的空位图。
//创建一个和原始图片相同环境的空位图
copyBitmap = Bitmap.createBitmap(orgBitmap.getWidth(),orgBitmap.getHeigh(),orgBitmap.getConfig());
5.对图片进行相应操作
创建一个Canvas 画布-现实中的画板:
//创建一个Canvas 画布-现实中的画板
canvas = new Canvas(copyBitmap);
创建一个画笔:
//创建一个画笔
paint = new Paint();
创建一个矩阵:
//创建一个矩阵
Matrix matrix = new Matrix();
画一幅图:
//画一幅图
canvas.drawBitmap(orgBitmap,matrix,paint);
显示图片:
//显示图片
foreground.setImageBitmap(copyBitmap);
6.添加触摸事件
给前景图片添加touch事件,当有触摸事件发生,系统就会将这个事件接收并回调这个事件
foreground.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//获取当前事件
int action = event.getAction();
//判断状态
if (action == MotionEvent.ACTION_MOVE){
//获取触摸点的坐标
int x = (int) event.getX();
int y = (int) event.getY();
//替换x,y对应的像素
for (int i = -8; i < 8; i++) {
for (int j = -8; j < 8; j++) {
copyBitmap.setPixel(x+i,y+j,Color.TRANSPARENT);
}
}
foreground.setImageBitmap(copyBitmap);
}
return true;
}
});
上面用到的一些属性定义为全局属性,放在onCreate()方法上面:
ImageView foreground;
Bitmap orgBitmap;
Bitmap copyBitmap;
Canvas canvas;
Paint paint;
通过这些步,这个demo的功能就可以实现了,接下来就可以运行看效果如何。
注:上面创建一个矩阵,可以通过矩阵对图片进行旋转、平移、翻转等操作:
//旋转图片
matrix.setRotate(90,240,400);
//平移
matrix.setTranslate(100,30);
//翻转 set只作用一次 post作用多次
matrix.setScale(-1f,1f);
matrix.postTranslate(orgBitmap.getWidth(),0);