一 安卓开发环境搭建
1.1 环境介绍
# 做安卓开发,需要会Java开发,需要安卓SDK,需要一款编辑器,需要软件测试环境(真机,虚拟机)
# 早期开发安卓app,需要使用eclipse+安卓SDK,自己搭建
# 目前开发安卓app,只需安装AndroidStudio,可以直接通过AndroidStudio下载SDK
# 编写完的代码要运行
-使用AndroidStudio自带的安卓虚拟机
-使用网易mumu,夜神模拟器等虚拟机
-使用真机(推荐),只要是安卓手机,开发usb调试,不需要root就可以使用
1.1 安卓集成开发环境
1.1.1 下载AndroidStudio
# 官方下载
# 历史版本下载
https://developer.android.google.cn/studio/archive?hl=zh-cn
#最新版本下载
https://developer.android.google.cn/studio
# 官方提供的使用教程
https://developer.android.google.cn/studio/intro?hl=zh-cn
# 项目构建工具介绍
Gradle和Maven都是Java项目的构建工具,但它们有一些区别:
1. 语法:Gradle使用Groovy语言进行编写,而Maven使用XML。Groovy更加灵活易读,XML更加严谨易于
用。
2. 性能:Gradle比Maven更加高效快速,因为它使用了增量构建模式,只会重新构建被更改的模块,而Mav
则需要重新构建整个项目。
3. 插件:Gradle的插件生态更加丰富和现代化,而Maven的插件相对较为传统。此外,Gradle的插件可以非
容易地编写和定制,而Maven的插件相对繁琐。
4. 维护:Maven有比较成熟的工具链和文档支持,而Gradle则相对较新,可能需要更多的自学
# Groovy介绍Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大
特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码
1.1.2 安装AndriodStudio
# 安装 Android步骤很简单,一路下一步即可
# 注意中间需要选择是否安装安装虚拟机(可以选择安装也可以不安装),如果使用真机调试,就不需要安卓虚
拟机
# 注意选择安装路径
1.1.5 配置环境变量
# 在SDK的安装目录下,有很多文件夹,如下
我们把emulator和paltform-tools目录加入到环境变量
── .gradle #AndroidStudio 自动生成的文件,会自动修改它的,
目打包时也会删除;
├── .idea # AndroidStudio自动生成的文件,会自动修改它的,
目打包时也会删除;
├── app # 应用相关的东西都在里面,工作的核心目录
│ ├── build # 编译的产物。某些情况下,可以手动把它整个删掉。
│ ├── libs # 依赖包可以放这里,比如一些jar文件。
│ ├── src # 代码在这。非常重要。
│ │ ├── main
│ │ │ ├── java # 放Java代码的地方
│ │ │ ├── res
│ │ │ │ ├── drawable # 应用图标
│ │ │ │ ├── layout # Android布局文件夹
│ │ │ │ ├── mipmap # 适配不同分辨率的手机
│ │ │ │ ├── mipmap # 桌面图标
│ │ │ │ └── values # 颜色、样式、字符集配置文件夹
│ │ │ ├──AndroidManifest.xml#APP运行配置文件,用来配置权限:程序入
配置、应用程序主题、应用程序组件等
│ ├── .gitignore # 版本控制
│ ├── build.gradle # 非常重要,app的构建配置。俗称“app的
gradle文件”。
│ └── proguard-rules.pro # 不管。这个是混淆配置。
├── gradle # 它是一个构建起配置文件
├── .gitignore # 整个工程的版本控制
├── build.gradle # 很重要。项目级的配置。俗称“项目grad
文件”
├── gradle.properties # 全局的gradle配置文件├── gradlew # Linux/mac上执行gradle命令
├── gradlew.bat # Windows上执行gradle命令
├── local.properties # 本地配置文件,一般不上传
└── settings.gradle # gralde的项目级配置
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#dddddd"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:id="@+id/image"
android:layout_height="300dp"
android:src="@color/pink"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"android:id="@+id/button01"
android:text="点击更换美女"></Button>
</LinearLayout>
</LinearLayout>
3.3 java(MainActivity.java)
package com.justin.justinapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button button01;
private ImageView image ;
private int id=R.drawable.a;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button01=findViewById(R.id.button01);
image=findViewById(R.id.image);
button01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"弹出吐
司",Toast.LENGTH_LONG).show();
if(id==R.drawable.a)
id=R.drawable.b;
else if(id==R.drawable.b)
id=R.drawable.c;
else {
id=R.drawable.a;
}
image.setImageResource(id);
}
});
}
}
# 安卓的网络加载,必须开启一个新的线程去做,主线程负责更新ui
# 1 手机要能上网
# 2 代理关闭
# 3 AndroidManifest.xml配置上网权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
</application>
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
package com.justin.s9demo01;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private Button button01; // 用来接受页面中的button
private ImageView image; // 用来接受页面中的Image
private int id = R.drawable.a;
private URL url = null;
private Bitmap bitmap = null;
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main); // 让这个java文件跟
activity_main.xml对应上
// //1 取到页面中的button和image
// button01 = findViewById(R.id.button); // 去activity_main根据id找组件
// image = findViewById(R.id.image);
// image.setImageResource(this.id);
// // 2 给按钮绑定事件,以后点击按钮,就会执行
// button01.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
// // 点击一次,弹出个吐司
// Toast.makeText(MainActivity.this, "换美女了",
Toast.LENGTH_LONG).show();
// // 点一下按钮,id变量,切换一下
// if (id == R.drawable.a) {
// id = R.drawable.b;
// } else if (id == R.drawable.b) {
// id = R.drawable.c;
// } else {
// id = R.drawable.a;
// }
//
// image.setImageResource(id);
// }
// });
//
//
// }
// 加载网络图片
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 让这个java文件跟activity_main.xm
对应上
//1 取到页面中的button和image
button01 = findViewById(R.id.button); // 去activity_main根据id找组件
image = findViewById(R.id.image);
image.setImageResource(this.id);
// 2 给按钮绑定事件,以后点击按钮,就会执行
button01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 点击一次,弹出个吐司
Toast.makeText(MainActivity.this, "换美女了",
Toast.LENGTH_LONG).show();
try {
url = new
URL("https://lmg.jj20.com/up/allimg/tx28/03102423387976.png");
requestImage(url);
} catch (Exception e) {
Log.e("justin", e.toString());
}
}
});
}
private void requestImage(URL url) {
// 开启新线程加载网络图片
new Thread() {
@Override
public void run() {
try {
bitmap = BitmapFactory.decodeStream(url.openStream());
showImg();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
private void showImg() {
// 更新ui,必须在主线程中
runOnUiThread(new Runnable() {
@Override
public void run() {
image.setImageBitmap(bitmap);
}
});
}
}