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控件

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

  1. 约束布局 ConstraintLayout
  2. 线性布局 LinearLayout 垂直 水平
  3. 相对布局 RelativeLayout
  4. 帧布局 FrameLayout
  5. 表格布局 tableLayout GridLayout
  6. 绝对布局 AbsoluteLayout
  • Design:拖拽控件,一个控件就是一个具体的类
  • Text:进行XML配置
    • 控件的尺寸
  1. match_parent 和父视图一样大
  2. wrap_content 包裹内容 和控件内容一样大
  3. 具体的大小 比如20dp
android:layout_width="match_parent"
 android:layout_height="match_parent"
  • 将一个控件添加到一个容器中,控件就是这个容器的子视图,容器是这个控件的父视图

XML添加控件

FrameLayout(帧布局)

更改主题样式和图标等

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testcloth">

    <application
        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">  // 主题
//  注册界面
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
//  配置作为启动起来的死一个界面
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

使用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上。

  • 创建控件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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">

// 背景图片
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/p2"
        />
// 显示操作后图片
    <ImageView
        android:id="@+id/iv_forground"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        />

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容