目的
- 了解Android Studio的基礎(chǔ)功能档泽,學(xué)習(xí)使用與掌握程序目錄部分
- 運(yùn)用基礎(chǔ)知識(shí)完成一個(gè)小demo
創(chuàng)建新項(xiàng)目
1.在左上角選擇創(chuàng)建新項(xiàng)目
2.選擇Empty Activity
3.更改所需要的部分,并點(diǎn)擊finish創(chuàng)建
程序目錄
Project窗口
默認(rèn)情況下,Android Studio 會(huì)在 Android 視圖中顯示您的項(xiàng)目文件止吐。此視圖并不能反映磁盤上的實(shí)際文件層次結(jié)構(gòu)劫谅,而是按模塊和文件類型進(jìn)行整理陵珍,以簡(jiǎn)化項(xiàng)目的關(guān)鍵源文件之間的導(dǎo)航方式,并隱藏某些不常用的文件或目錄蜕着。與磁盤上的結(jié)構(gòu)相比,一些結(jié)構(gòu)變化包括以下方面:
- 在頂級(jí) Gradle Script 組中顯示相應(yīng)項(xiàng)目的所有與編譯相關(guān)的配置文件红柱。
- 在模塊級(jí)組中顯示每個(gè)模塊的所有清單文件(當(dāng)您針對(duì)不同的產(chǎn)品類型和編譯類型使用不同的清單文件時(shí))承匣。
- 在一個(gè)組(而非在每個(gè)資源限定符的單獨(dú)文件夾)中顯示所有備用資源文件。例如豹芯,您的啟動(dòng)器圖標(biāo)的所有密度版本都可以并排顯示
在每個(gè) Android 應(yīng)用模塊中悄雅,文件顯示在以下組中:
manifests
包含 AndroidManifest.xml
文件;每個(gè)應(yīng)用的根目錄中都必須包含一個(gè) AndroidManifest.xml
文件(且文件名精確無誤)铁蹈; 清單文件向 Android 系統(tǒng)提供應(yīng)用的必要信息宽闲,系統(tǒng)必須具有這些信息方可運(yùn)行應(yīng)用的任何代碼
此外众眨,清單文件還可執(zhí)行以下操作:
- 為應(yīng)用的 Java 軟件包命名。軟件包名稱充當(dāng)應(yīng)用的唯一標(biāo)識(shí)符容诬。
- 描述應(yīng)用的各個(gè)組件娩梨,包括構(gòu)成應(yīng)用的 Activity、服務(wù)览徒、廣播接收器和內(nèi)容提供程序狈定。它還為實(shí)現(xiàn)每個(gè)組件的類命名并發(fā)布其功能,例如它們可以處理的 Intent 消息习蓬。這些聲明向 Android 系統(tǒng)告知有關(guān)組件以及可以啟動(dòng)這些組件的條件的信息纽什。
- 確定托管應(yīng)用組件的進(jìn)程。
- 聲明應(yīng)用必須具備哪些權(quán)限才能訪問 API 中受保護(hù)的部分并與其他應(yīng)用交互躲叼。還聲明其他應(yīng)用與該應(yīng)用組件交互所需具備的權(quán)限
- 列出 Instrumentation 類芦缰,這些類可在應(yīng)用運(yùn)行時(shí)提供分析和其他信息。這些聲明只會(huì)在應(yīng)用處于開發(fā)階段時(shí)出現(xiàn)在清單中枫慷,在應(yīng)用發(fā)布之前將移除让蕾。
- 聲明應(yīng)用所需的最低 Android API 級(jí)別
- 列出應(yīng)用必須鏈接到的庫(kù)
Java
包含 Java 源代碼文件(以軟件包名稱分隔各文件,包括 JUnit 測(cè)試代碼)
res
包含所有非代碼資源(例如 XML 布局或听、界面字符串和位圖圖像)探孝,這些資源劃分到相應(yīng)的子目錄中
Activity的生命周期
概念
Activity是最基本的模塊,一般稱之為“活動(dòng)”誉裆,在應(yīng)用程序中顿颅,一個(gè)Activity通常就是一個(gè)
單獨(dú)的屏幕
。簡(jiǎn)單理解找御,Activity代表一個(gè)用戶所能看到的屏幕元镀,主要用于處理應(yīng)用程序的整體性工作,例如監(jiān)聽系統(tǒng)事件霎桅,為用戶顯示指定的View栖疑,啟動(dòng)其他Activity等。所有應(yīng)用的Activity都繼承于android.app.Activity類滔驶,該類是Android提供的基層類遇革,其他的Activity繼承該父類后,通過父類的方法來實(shí)現(xiàn)各種功能揭糕。
生命周期
對(duì)應(yīng)接口與調(diào)用順序
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override //界面啟動(dòng) 展現(xiàn)出來
protected void onStart() {
super.onStart();
System.out.println("onStart");
}
@Override //重新啟動(dòng)一個(gè)界面
protected void onRestart() {
super.onRestart();
System.out.println("onRestart");
}
@Override //恢復(fù)界面 從后臺(tái)到前臺(tái)
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");
}
}
DEMO
XML
創(chuàng)建控件
背景圖片&顯示操作后的圖片
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
android:id="@+id/fl_main">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/bg"/>
<ImageView
android:id="@+id/iv_forground"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
MainActivity
配置界面
// 配置界面
setContentView(R.layout.activity_main);
// 找到容器里面的圖片視圖控件
// findViewById
forgound = findViewById(R.id.iv_forground);
讀取原圖
// 將需要操作的圖片讀取出來 Bitmap
// BitmapFactory 用于管理位圖
// decodeResource 從工程的資源路徑中去生成一張位圖
// getResources() 獲取工程的資源
// R.drawable.bb 訪問資源路徑下 drawable里面的一個(gè)文件名為bb的資源
orgBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.fr);
創(chuàng)建副本
// 操作這張圖片 用透明色去替換某個(gè)位置的顏色
// 不能操作原圖 只能copy一份
// 創(chuàng)建一個(gè)和原始圖片相同環(huán)境的空位圖
copyBitmap = Bitmap.createBitmap(orgBitmap.getWidth(),orgBitmap.getHeight(),orgBitmap.getConfig());
圖片操作
// 創(chuàng)建一個(gè)Canvas 畫布-現(xiàn)實(shí)中的畫板
canvas = new Canvas(copyBitmap);
// 創(chuàng)建一個(gè)畫筆
paint = new Paint();
// 創(chuàng)建一個(gè)矩陣
Matrix matrix = new Matrix();
// 旋轉(zhuǎn)圖片
// matrix.setRotate(90,244,455);
// 翻轉(zhuǎn) set只作用一次 post作用多次
// matrix.setScale(0.5f,1f);
// matrix.postTranslate(orgBitmap.getWidth(),0);
// 平移
// matrix.setTranslate(50,0);
// 畫一幅圖
canvas.drawBitmap(orgBitmap,matrix,paint);
// 顯示圖片
forgound.setImageBitmap(copyBitmap);
添加觸摸事件
// 給前景圖片添加touch事件
// 當(dāng)有觸摸事件發(fā)生 系統(tǒng)就會(huì)將這個(gè)事件接收并回調(diào)這個(gè)事件
forgound.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 獲取當(dāng)前事件
int action = event.getAction();
// 判斷狀態(tài)
if (action == MotionEvent.ACTION_MOVE){
// 獲取觸摸點(diǎn)的坐標(biāo)
int x =(int) event.getX();
int y =(int) event.getY();
System.out.println(canvas);
// 替換x萝快、y對(duì)應(yīng)的像素
for (int i = -8; i < 8; i++) {
for (int j = -8; j < 8; j++) {
copyBitmap.setPixel(x+i,y+j,Color.TRANSPARENT);
}
}
forgound.setImageBitmap(copyBitmap);
}
return true;
}
});
心得體會(huì)
今天一接觸Android就很困難,有很多地方不是很清楚著角,最后demo做出來也一直閃退揪漩,氣死