android 撕衣服,Android初体验之撕衣服项目

一、准备工作

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,不过有了界面之后,学习更有激情了!

你可能感兴趣的:(android,撕衣服)