今天是正式进入Android开发的第一天,只是简单地来做了一个小Demo,通过对它的敲写来慢慢的打开进入Android开发的大门和学习开发中的一些知识点。
目的:
- 敲写一个小Demo了解安卓开发的一些知识点
技术:
- xml文件的运用
- 资源文件和 Activity
实际的敲写:
-
资源介绍和Activity生命周期
首先,我们打开Android studio新建一个工程。建好后,在我们的Android studio左边出现了一栏的目录。我们先来介绍一下它们,及它们的作用。
- manifests:通过它我们可以配置启动界面、风格、注册界面等等。只不过这些不用我们来配置,都是由系统来配置。
- Java:就是我们敲写的一些界面以及功能的代码全在里面。
- resources(res):是我们资源文件,我们的资源都放在这里面
-
对于我们在做一个工程是所需的图片,我们可以直接复制粘贴放在我们的drawable里面,也可以直接在外面拖拽进入drawable里面。这样,所需的图片就可以使用了。
其它的我就不介绍了,可以看图片。
在我们的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的界面布局:
在这里,有需要注意的知识点:
- 默认一个Activity对应一个xml配置文件
- 命名特点:activity_界面功能.xml
- xml文件就是一个容器 :可以放很多UI控件
- 布局:这么多的控件该如何布局
1.约束布局 ConstraintLayout
2.线性布局 LinearLayout (垂直/水平)
3.相对布局 RelativeLayout
4.帧布局 FrameLayout(可以重叠)
5.表格布局 TableLayout GridLayout
6.绝对布局 AbsoluteLayout
我们今天所要敲写的这个Dmeo是由对图片进行重叠的一个需求,所以我们采用的是帧布局FrameLayout来进一个界面的布局。
我们的帧布局已经搞好了,需要的就是来显示我们的图片
,而图片就是一个控件,控件就是一个视图,视图就是看得到东西。所以,它有很多的控件供我们使用。
* 控件 = 一个视图 = 看到的都是视图
* 1.基础阶段:学习系统自带的控件 熟悉
* TextView EditText Button ImageView ListView
* RecycleView ScrollView ViewPager ProgressBar
* Switch
* 2.高级阶段:自定义
* a.在已有的控件基础上加上自己的功能 继承
* b.自己画
*/
* 控件的尺寸
* 父视图:
* 子视图:
* 将一个控件添加到一个容器中,控件就是这个容器的子视图
* 容器就是这个控件的父视图
* 一个控件就是一个类的具体对象
* ImageView :
* 属性
* 方法
*/
在这里,我们使用的是ImageView控件。
三种确定控件大小的方式:
* 1.match_parent 和父视图一样大
* 2.wrap_content 包裹内容 和空键的内容一样大
* 3.20dp 具体尺寸
*/
* 通过添加id号可以唯一标识某一个
* android:id="@+id/fl_main"
*/
前面我们说了界面的布局有两种方法,那么我们的控件创建又由哪些方法来完成呢?
- 什么时候需要用代码创建 什么时候使用xml配置
- 如果添加的控件是静态的(变化的对象不多)选择xml配置
-
如果需要灵活的操控这个控件 选择代码创建
xml配置创建控件:
代码创建:
Demo:
创建控件:
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;
}
});
}
至于运行结果,我是在真机上直接运行的,不是模拟器,所以无法在这显示了。