一、准备工作
start 一个新的安卓工程 --->选择Empty Activity----->给工程起一个名字叫tearcloth ------->选择Java语言-------->点击完成
Android 工程目录介绍
工程目录
manifests: AndroidManifest.xml 清单文件 程序的配置文件:启动界面,风格,注册界面等。在程序中定义的所以四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。
java目录是放置我们所有java代码的地方,第一个是子文件 后面两个是单元测试文件,其中AndroidTest是用来编写Android Test测试用例的,可以对项目进行一些自动化测试;test是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
res: 这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片,布局,字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。
以drawable开头的文件夹都是用来放图片的
以mipmap开头的文件夹都是用来放应用图标的
以values开头的文件夹都是用来放字符串、样式、颜色等配置
layout文件夹是用来放布局文件的
Gradle: 工具文件 添加依赖
Activity的⽣生命周期
在日常应用中Activity是与用户交互的接口,它提供了一个用户完成相关操作的窗口。当我们在开发中创建Activity后,通过调用setContentView(View)方法来给该Activity指定一个布局界面,而这个界面就是提供给用户交互的接口。而生命周期就是管理一个界面从创建到运行到结束的整个过程。
Activity生命周期
启动 Activiy:onCreate => onStart() => onResume(), Activity 进入运行状态.
Activity 退居后台 ( Home 或启动新 Activity ): onPause() => onStop().
Activity 返回前台: onRestart() => onStart() => onResume(). Activity 后台期间内存不足情况下当再次启动会重新执行启动流程。
锁屏: onPause() => onStop().
解锁: onStart() => onResume().
点击home键 回到主界面 onPause()
使用返回键 返回主界面 onPause()=> onDestroy()
界面布局
XML界⾯布局
默认一个Activity对应一个xml配置文件,命名特点:activity_界面功能.xml,xml文件就是一个容器:可以存放很多UI控件
布局:这么多控件如何布局
约束布局 ConstraintLayout
线性布局 LinearLayout 垂直 水平
相对布局 RelativeLayout
帧布局 FrameLayout
表格布局 tableLayout GridLayout
绝对布局 AbsoluteLayout
Design:拖拽控件,一个控件就是一个具体的类
Text:进行XML配置
控件的尺寸
match_parent 和父视图一样大
wrap_content 包裹内容 和控件内容一样大
具体的大小 比如20dp
android:layout_width="match_parent"
android:layout_height="match_parent"
将一个控件添加到一个容器中,控件就是这个容器的子视图,容器是这个控件的父视图
XML添加控件
更改主题样式和图标等
package="com.example.testcloth">
android:allowBackup="true"
android:icon="@mipmap/ic_launcher" // 图标
android:label="@string/app_name" // 名称
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"> // 主题
// 注册界面
// 配置作为启动起来的死一个界面
使用Java代码创建
&esnp;使用Java代码块来布局界面,通过添加id号android:id="@+id/f1_main"
public void code(){
// 通过代码布局界面
// 1. 找一个容器
FrameLayout container = findViewById(R.id.fl_main);
// 3. 创建一个子视图
// 创建ImageView显示图片
ImageView backgroundImageView = new ImageView(this);
// 设置属性
backgroundImageView.setBackgroundColor(Color.GREEN);
// 添加到容器里
container.addView(backgroundImageView,container.getWidth(),container.getHeight());
// 2. 设置当前这个界面的内容视图为这个容器
setContentView(container);
}
注意:安卓推荐使用XML布局界面
如果添加的控件是静态的(变化的东西不多),选择XML创建
如果需要灵活地操作这个控件,选择代码创建
二、撕衣服项目
思路:使用透明色去替换原有图片的对应点的像素,利可获取替换之后的图片,将图片显示在ImageView上。
创建控件
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/fl_main">
// 背景图片
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/p2"
/>
// 显示操作后图片
android:id="@+id/iv_forground"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
MainActivity中配置界面
读取原图
创建副本
图片操作
添加触摸事件
public class MainActivity extends AppCompatActivity {
ImageView forground;
Bitmap orgBitmap;
Bitmap copyBitmap;
Canvas canvas;
Paint paint;
@Override//创建一个界面 界面如何布局
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 配置界面 容器在XML文件里面
setContentView(R.layout.activity_main);
// 找到容器里面的图片视图控件
forground = findViewById(R.id.iv_forground);
// 将需要操作的图片读取出来
// BitmapFactory 用于管理位图
// decodeResources() 从工程的资源路径中去生成一张图片
// getResources() 获取工程的资源
// R.drawable.p1 访问一张图片
orgBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.p1);
// 操作这张图片 用透明色去替换某个位置的颜色
// 不能操作原图 只能拷贝一份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,240,400);
// 平移
// matrix.setTranslate(500,0);
// 翻转 set只作用一次
// 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 = -8; i < 0; i++) {
for (int j = -8;j < 0;j++){
copyBitmap.setPixel(x,y,Color.TRANSPARENT);
}
}
//canvas.drawBitmap(orgBitmap,new Matrix(),paint);
forground.setImageBitmap(copyBitmap);
}
return true;
}
});
}
}
三、心得体会
今天是正式进入Android开发的第一天,可能是因为第一天,今天讲的项目还有些地方不是很理解,项目本身也有一些BUG,不过有了界面之后,学习更有激情了!