1.程序目錄介紹
程序目錄介紹.png
2.Activity類
Activity是一個應用組件盐固,用戶可與其提供的屏幕進行交互。 每個 Activity 都會獲得一個用于繪制其用戶界面的窗口混巧。窗口通常會充滿屏幕,但也可小于屏幕并浮動在其他窗口之上怨咪。
一個應用通常由多個彼此松散聯(lián)系的 Activity 組成拭荤。 一般會指定應用中的某個 Activity 為“主”Activity,即首次啟動應用時呈現(xiàn)給用戶的那個 Activity震叮。
Android里面大部分的控件都會提供很多方法胧砰,這些方法只需要自己去重寫,不需要自己調(diào)用冤荆。
Activity 實際就是一個界面朴则,管理一個界面從創(chuàng)建,運行到結(jié)束的整個過程 / 生命周期。
2.1Activity的生命周期圖
Activity的狀態(tài)轉(zhuǎn)換.png
2.2Activity生命周期的回調(diào)方法
- onCreate()
這個方法是系統(tǒng)調(diào)用的乌妒,首次創(chuàng)建 Activity 時調(diào)用汹想,始終后接 onStart()。
- onStart()
在 Activity 即將對用戶可見之前調(diào)用撤蚊。
如果 Activity 轉(zhuǎn)入前臺古掏,則后接 onResume(),如果 Activity 轉(zhuǎn)入隱藏狀態(tài)侦啸,則后接 onStop()槽唾。
- onResume()
在 Activity 即將開始與用戶進行交互之前調(diào)用。
此時光涂,Activity 處于 Activity 堆棧的頂層庞萍,并具有用戶輸入焦點。始終后接 onPause()忘闻。
- onPause()
當系統(tǒng)即將開始繼續(xù)另一個 Activity 時調(diào)用钝计。
此方法通常用于確認對持久性數(shù)據(jù)的未保存更改、停止動畫以及其他可能消耗 CPU 的內(nèi)容齐佳,諸如此類私恬。
它應該非常迅速地執(zhí)行所需操作,因為它返回后炼吴,下一個 Activity 才能繼續(xù)執(zhí)行本鸣。
如果 Activity 返回前臺,則后接 onResume()硅蹦,如果 Activity 轉(zhuǎn)入對用戶不可見狀態(tài)荣德,則后接onStop()。
- onStop()
在 Activity 對用戶不再可見時調(diào)用提针。
如果 Activity 被銷毀命爬,或另一個 Activity(一個現(xiàn)有 Activity 或新 Activity)繼續(xù)執(zhí)行并將其覆蓋,就可能發(fā)生這種情況辐脖。
如果 Activity 恢復與用戶的交互饲宛,則后接 onRestart(),如果 Activity 被銷毀嗜价,則后接onDestroy()艇抠。
- onDestroy()
在 Activity 被銷毀前調(diào)用。這是 Activity 將收到的最后調(diào)用久锥。
當 Activity 結(jié)束(有人對 Activity 調(diào)用了 finish())家淤,或系統(tǒng)為節(jié)省空間而暫時銷毀該 Activity 實例時,可能會調(diào)用它瑟由。 可以通過 isFinishing() 方法區(qū)分這兩種情形絮重。
- onRestart()
在 Activity 已停止并即將再次啟動前調(diào)用。始終后接 onStart()。
2.3Activity的這些方法在一些情況的調(diào)用
界面啟動:
onCreate()
onStart()
onResume()點擊home鍵青伤,回到主界面:
onPause()通過后臺重新運行這個程序:
onRestart()
onStart()
onResume()使用返回鍵督怜,返回到主界面:
onPause()
onDestroy()
3.界面布局方式
3.1. xml配置
默認一個Activity對應一個xml配置文件。
xml配置文件命名特點:activity_界面功能.xml狠角。
xml文件就是一個容器:可以放很多UI控件的容器号杠。
當有很多控件時該如何布局?布局方法:
1.約束布局 ConstraintLayout
2.線性布局 LinearLayout 垂直 水平
3.相對布局 RelativeLayout
4.幀布局 FrameLayout
5.表格布局 TableLayout GridLayout
6.絕對布局 AbsoluteLayout
XML布局的常見屬性
xml布局屬性.png
3.2. 使用Java代碼創(chuàng)建
通過代碼來布局界面:
<1>.使用幀布局方式FrameLayout丰歌,在xml布局文件類里面將布局方式改為FrameLayout姨蟋,并在容器資源里添加一個id號,以便通過id號找到這個容器資源
<2>.在app->java->MainActivity文件里面進行代碼布局
1.找一個容器
2.創(chuàng)建一個子視圖
3.設置當前這個界面的內(nèi)容視圖為這個容器
3.3什么時候需要用代碼創(chuàng)建立帖?什么時候使用xml配置眼溶?
如果添加的控件是靜態(tài)的(變化的東西不多),選擇xml配置厘惦。xml布局控件間耦和性更低偷仿,布局更方便哩簿,安卓開發(fā)里面經(jīng)常使用宵蕉。
如果需要靈活地操作這個控件 ,選擇代碼創(chuàng)建节榜。
4.控件
控件是指對數(shù)據(jù)和方法的封裝羡玛。一個控件就是一個類的具體對象。
控件可以有自己的屬性和方法宗苍,其中屬性是控件數(shù)據(jù)的簡單訪問者稼稿,方法則是控件的一些簡單而可見的功能、控件創(chuàng)建過程包括設計讳窟、開發(fā)让歼、調(diào)試(就是所謂的3Ds開發(fā)流程,即Design、Develop丽啡、Debug)工作谋右, 然后是控件的使用。
因為控件是可見的补箍,一個控件就相當于一個視圖改执。對控件的學習分為兩個階段:基礎階段和高級階段。
基礎階段主要是學習系統(tǒng)自帶的控件坑雅,對系統(tǒng)控件要比較熟悉運用辈挂,系統(tǒng)自帶的控件有 TextView,EditText裹粤,Button终蒂,ImageView,ListView,RecycleView拇泣,ScrollView悉尾,ViewPager,ProgressBa挫酿,Switch等构眯。
高級階段主要是學習自定義控件。包括在已有的控件基礎上加上自己的功能早龟,學會自己自己畫或者設置一個控件惫霸。
4.1父視圖與子視圖
將一個控件添加到一個容器中,控件就是這個容器的子視圖葱弟,容器就是這個控件的父視圖壹店。
4.2控件的尺寸設置
- match_parent 和父視圖一樣大
- wrap_content 包裹內(nèi)容,和控件的內(nèi)容一樣大
- 自己寫一個具體尺寸芝加,例如20dp硅卢。(dp為單位)
控件尺寸單位
- dp (dip): 即設備無關像素(device independent pixels),這種尺寸單位在不同設備上的物理大小相同藏杖。
- px:即像素(pixel)将塑。
- pt:通常用來作為字體的尺寸單位,1 pt相當于1/72英寸蝌麸。
- inch:英寸点寥,1 英寸約等于2.54厘米,主要用來描述手機屏幕的大小来吩。
- sp:通常用作字體的尺寸單位敢辩,實際大小還與具體設備上的用戶設定有關。
5.Demo:
使用圖片布局弟疆,在圖片上滑動可以改變圖片像素戚长。
1.創(chuàng)建兩張圖片視圖的控件
在res->layout->activity_main.xml 的文件里面布局,其中圖片放在res->drawable文件里面怠苔。
//設置背景圖片
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/bg"/>
//設置前景圖片
<ImageView
android:id="@+id/iv_foreground"
android:layout_width="match_parent"
android:layout_height="match_parent" />
上面通過id號可以唯一標識某一個控件或者組件(容器):android:id="@+id/iv_foreground"
2. 下面在app->java->MainActivity文件里面配置界面同廉,找到圖片視圖的控件:
//配置界面
setContentView(R.layout.activity_main);
//找到容器里面的圖片視圖控件
foreground = findViewById(R.id.iv_foreground);
3.讀取原圖,將需要操作的圖片讀取出來
decodeResource 從工程的資源路徑中去生成一張位圖
getResource() 獲取工程的資源
R.drawable.fr 訪問資源路徑下 drawable里面的一個文件名為fr的圖片
//將需要操作的圖片讀取出來
//decodeResource 從工程的資源路徑中去生成一張位圖
//getResource() 獲取工程的資源
//R.drawable.fr 訪問資源路徑下 drawable里面的一個文件名為fr的圖片
orgBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.fr);
4.創(chuàng)建副本
操作這張圖片實際就是用透明色去替換某個位置的顏色嘀略,但是不能操作原圖恤溶,只能copy一份,創(chuàng)建一個和原始圖片相同環(huán)境的空位圖帜羊。
//創(chuàng)建一個和原始圖片相同環(huán)境的空位圖
copyBitmap = Bitmap.createBitmap(orgBitmap.getWidth(),orgBitmap.getHeigh(),orgBitmap.getConfig());
5.對圖片進行相應操作
創(chuàng)建一個Canvas 畫布-現(xiàn)實中的畫板:
//創(chuàng)建一個Canvas 畫布-現(xiàn)實中的畫板
canvas = new Canvas(copyBitmap);
創(chuàng)建一個畫筆:
//創(chuàng)建一個畫筆
paint = new Paint();
創(chuàng)建一個矩陣:
//創(chuàng)建一個矩陣
Matrix matrix = new Matrix();
畫一幅圖:
//畫一幅圖
canvas.drawBitmap(orgBitmap,matrix,paint);
顯示圖片:
//顯示圖片
foreground.setImageBitmap(copyBitmap);
6.添加觸摸事件
給前景圖片添加touch事件咒程,當有觸摸事件發(fā)生,系統(tǒng)就會將這個事件接收并回調(diào)這個事件
foreground.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//獲取當前事件
int action = event.getAction();
//判斷狀態(tài)
if (action == MotionEvent.ACTION_MOVE){
//獲取觸摸點的坐標
int x = (int) event.getX();
int y = (int) event.getY();
//替換x讼育,y對應的像素
for (int i = -8; i < 8; i++) {
for (int j = -8; j < 8; j++) {
copyBitmap.setPixel(x+i,y+j,Color.TRANSPARENT);
}
}
foreground.setImageBitmap(copyBitmap);
}
return true;
}
});
上面用到的一些屬性定義為全局屬性帐姻,放在onCreate()方法上面:
ImageView foreground;
Bitmap orgBitmap;
Bitmap copyBitmap;
Canvas canvas;
Paint paint;
通過這些步稠集,這個demo的功能就可以實現(xiàn)了,接下來就可以運行看效果如何饥瓷。
注:上面創(chuàng)建一個矩陣剥纷,可以通過矩陣對圖片進行旋轉(zhuǎn)、平移呢铆、翻轉(zhuǎn)等操作:
//旋轉(zhuǎn)圖片
matrix.setRotate(90,240,400);
//平移
matrix.setTranslate(100,30);
//翻轉(zhuǎn) set只作用一次 post作用多次
matrix.setScale(-1f,1f);
matrix.postTranslate(orgBitmap.getWidth(),0);