今天是正式进入Android开发的第一天,只是简单地来做了一个小Demo,通过对它的敲写来慢慢的打开进入Android开发的大门和学习开发中的一些知识点。

目的:

敲写一个小Demo了解安卓开发的一些知识点

技术:

xml文件的运用

资源文件和 Activity

实际的敲写:

资源介绍和Activity生命周期

首先,我们打开Android studio新建一个工程。建好后,在我们的Android studio左边出现了一栏的目录。我们先来介绍一下它们,及它们的作用。

40.PNG

manifests:通过它我们可以配置启动界面、风格、注册界面等等。只不过这些不用我们来配置,都是由系统来配置。

Java:就是我们敲写的一些界面以及功能的代码全在里面。

resources(res):是我们资源文件,我们的资源都放在这里面

对于我们在做一个工程是所需的图片,我们可以直接复制粘贴放在我们的drawable里面,也可以直接在外面拖拽进入drawable里面。这样,所需的图片就可以使用了。

其它的我就不介绍了,可以看图片。

41.PNG

在我们的java里面的MainActivity中所谓的Activity:在我们的java里面的MainActivity中所谓的Activity:

Activity = 一个界面(系统自带的一个类,管理界面的)

管理一个界面从运行到结束的整个过程/生命周期

配置界面 onCreate (这个方法的重写是系统调用的)

启动界面 start

重新启动 restart

唤醒界面 resume

暂停界面 pause

销毁界面 destroy

@Override //界面启动 界面展示出来了
protected void onStart() {
super.onStart();
System.out.println("onStart");
}
@Override //重新启动一个界面
protected void onRestart() {
super.onRestart();
System.out.println("onRestart");
}
@Override //恢复界面 从后台到前台
protected void onResume() {
super.onResume();
System.out.println("onResume");
}
@Override //暂停界面 界面切换
protected void onPause() {
super.onPause();
System.out.println("onPause");
}
@Override //界面销毁
protected void onDestroy() {
super.onDestroy();
System.out.println("onDestroy");
}

当我们在运行一个程序时,它会经过一下几个状态:

界面启动(点击运行程序)

* 先调用onCreate方法

* onStart

* onResume

*

* 点击home键 回到主界面

* 会先暂停一下 onPause(通常是保存当前的运行状态)

*

* 通过后台 重新运行这个程序(再次打开程序)

* onRestart

* onStart

* onResume

*

* 使用返回键 返回到主界面

* onPause

* onDestroy

xml配置:

当我们在MainActivity里面的onCreat方法里面创建一个界面,那么我们的界面该如何进行布局呢?

通常在开发中有两种方式进行界面布局。

xml配置

使用Java代码创建

在我们安卓开发中,更建议使用的时xml来配置,原因是这是一种解耦的设计模式。

解耦:这个是Java里面的一个理念 ,在面型对象中把原来引用很紧密的对象通过中间的一层进行分离,不直接引

用,可能是只引用接口。这样感觉起来因为不直接引用,所以修改起来就好办多了。但实际上还是有引用的。

xml的界面布局:

43.PNG

在这里,有需要注意的知识点:

默认一个Activity对应一个xml配置文件

命名特点:activity_界面功能.xml

xml文件就是一个容器 :可以放很多UI控件

布局:这么多的控件该如何布局

1.约束布局 ConstraintLayout

2.线性布局 LinearLayout (垂直/水平)

3.相对布局 RelativeLayout

4.帧布局 FrameLayout(可以重叠)

5.表格布局 TableLayout GridLayout

6.绝对布局 AbsoluteLayout

我们今天所要敲写的这个Dmeo是由对图片进行重叠的一个需求,所以我们采用的是帧布局FrameLayout来进一个界面的布局。

45.PNG

46.PNG

44.PNG

我们的帧布局已经搞好了,需要的就是来显示我们的图片

,而图片就是一个控件,控件就是一个视图,视图就是看得到东西。所以,它有很多的控件供我们使用。

* 控件 = 一个视图 = 看到的都是视图

* 1.基础阶段:学习系统自带的控件 熟悉

* TextView EditText Button ImageView ListView

* RecycleView ScrollView ViewPager ProgressBar

* Switch

* 2.高级阶段:自定义

* a.在已有的控件基础上加上自己的功能 继承

* b.自己画

*/

* 控件的尺寸

* 父视图:

* 子视图:

* 将一个控件添加到一个容器中,控件就是这个容器的子视图

* 容器就是这个控件的父视图

* 一个控件就是一个类的具体对象

* ImageView :

* 属性

* 方法

*/

在这里,我们使用的是ImageView控件。

57.PNG

三种确定控件大小的方式:

* 1.match_parent 和父视图一样大

* 2.wrap_content 包裹内容 和空键的内容一样大

* 3.20dp 具体尺寸

*/

47.PNG

* 通过添加id号可以唯一标识某一个

* android:id="@+id/fl_main"

*/

前面我们说了界面的布局有两种方法,那么我们的控件创建又由哪些方法来完成呢?

什么时候需要用代码创建 什么时候使用xml配置

如果添加的控件是静态的(变化的对象不多)选择xml配置

如果需要灵活的操控这个控件 选择代码创建

xml配置创建控件:

48.PNG

代码创建:

49.PNG

Demo:

创建控件:

44.PNG

MainActivity界面配置:

public class MainActivity extends AppCompatActivity {
Bitmap copyBitmap;
Canvas canvas;
Paint paint;
Bitmap orgBitmap;
ImageView forground;
@Override //创建一个界面 界面如何布局
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//配置界面
setContentView(R.layout.activity_main);
//找到容器里面的图片
//findViewById
forground = findViewById(R.id.iv_foreground);
//将需要操作的图片读取出来
//BitmapFactory 用于管理位图
//decodeResource 从工程的资源路径中去生成一张图片
//getResource 获取工程的资源
//R.drawable.fr 访问资源路径下 drawable里面的一个fr文件
orgBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.fr);
//操作这张图片 用透明色去替换某个位置的颜色
//不能操作原图 只能copy一份
copyBitmap = Bitmap.createBitmap(orgBitmap.getWidth(),
orgBitmap.getHeight(),orgBitmap.getConfig());//当作画布
//创建一个Canvas 画布-现实中的画板
canvas = new Canvas(copyBitmap);
//创建一个画笔
paint = new Paint();
//创建一个矩阵
Matrix matrix = new Matrix();
//旋转图片
// matrix.setRotate(90,540,1124);
//平移
//matrix.setTranslate(540,0);
//翻转 set只作用一次 post作用多次
//matrix.setScale(-1f,1f);
//matrix.postTranslate(orgBitmap.getWidth(),0);
//画一幅图
canvas.drawBitmap(orgBitmap,matrix,paint);
//显示图片
forground.setImageBitmap(copyBitmap);
//给前景图片添加touch事件
//当有触摸事件发生,系统就会将在这个事件接收并回调这个事件
forground.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 = -9; i < 9; i++) {
for (int j = -9; j < 9; j++) {
copyBitmap.setPixel(x+i,y+j,Color.TRANSPARENT);
}
}
//canvas.drawBitmap(orgBitmap,new Matrix(),paint);
forground.setImageBitmap(copyBitmap);
}
return true;
}
});
}

至于运行结果,我是在真机上直接运行的,不是模拟器,所以无法在这显示了。