Android基礎小結

Activity

創建:自定義類繼承Activity ?重寫 onCreate 方法

注冊:需要在 AndroidManifest.xml 中注冊 Activity

跳轉:

顯示意圖跳轉:(一般打開自己的Activity)

創建兩個類 為FirstActivity 和 SecondActivity 并在清單中聲明 不用配置意圖過濾器

label 為應用名字 icon 為圖標 ?application 中的label 應用界面中應用名字 icon應用設置界面的圖標

通過Intent 帶參構造函數 Intent intent = new Intent(this,SecondActivity.class)

若打開其他應用的 需要 new Intent(); intent.setClassName("包名","全類名") 并在清單文件中聲明 exported為 true

Intent 可以攜帶八種基本數據類型:boolean byte char short int float double long String 以及他們的數組形式

隱式意圖跳轉:(一般讓其他應用打開自己的Activity)

將第二個Activity在清單文件中 注冊 設置 意圖過濾器 intent-filter action"域名倒寫" ?category 配置為category.DEFAULT 系統默認

Intent intent = new Intent();

intent.setAction(必須和清單文件中的action一樣);

intent.setDate(Uri.parse("itheima"+xxx))(與清單文件data scheme 內容相同)

媒體類型 mimeType"父類型/子類型" intent.setType("父類型/子類型") 若既有data也有type 要intent.setDataAndType(data,type)

或者 intent.setAction(Intent.ACTION_CALL) intent.setDate(Uri.parse("tel:"+110);設置一個動作 攜帶數據

startActivity(intent);

生命周期:

foreground 前臺狀態 ?執行onResume(刷新數據)后 onstart()

paused 暫停狀態 ? ? ?若有透明應用覆蓋或者有對話框應用 覆蓋的時候onPause 恢復的時候onResume

stopped 停止狀態 ? ? onStop(停止刷新界面) 不可見而且不可以操作 按home鍵之后

simple 銷毀狀態onDestroy(釋放資源)

onCreate

界面的初始化 setcontentView ?findviewbyid

數據的初始化 文件/數據庫/網絡/其它的組件/sp

開啟其它的組件(開啟服務,注冊廣播接收者)

動態注冊廣播接收者(onCreate注冊 onDestroy注銷 onstart注冊的onStop注銷 onResume注冊 onPause注銷)

onstart

onResume 刷新界面

onPause ? ?停止刷新界面

onStop

onDestroy 釋放資源 數據庫的鏈接 cursor sqlitedatabase bind的服務 廣播接收者注銷 退出線程

onRestart

創建 onCreate onstart onResume 按返回鍵后 onPause onStop onDestroy

按Home鍵 onPause onStop按home鍵返回 onRestart onstart onResume

startActivityForResult(intent,requestCode); (開啟另外一個Activity)

onActivityResult(int requestCode, int resultCode, Intent data);

setResult(resultCode, intent data); finish(); (返回數據的activity)

屏幕旋轉時生命周期:

onPause onStop onDestroy onCreate onstart onResum

1.默認:Activity會銷毀 屏幕旋轉后會創建新的Activity

2.寫死屏幕方向 ?在清單文件中screenOrientation landscape 水平 portrait 豎直

3.configChanges orientation|screenSize 隨著方向改變 不會銷毀生命周期

重寫onConfigurationChanged 屏幕旋轉生命周期方法 處理相關業務邏輯

Activity任務棧(啟動模式):

standard 默認情況 只要調用startActivity就會創建新的實例

singleTop 棧頂只有一個實例 如果當前的activity在任務棧的棧頂那么 不會創建新的實例 除此之外 不會影響實例的創建

(一系列調用的最后一個頁面 為了避免在這個頁面上再創建新的實例可以配置為singleTop)

singleTask 一個任務棧中只有一個實例 如果這個activity在棧頂 再次調用startactivity不會創建新的 實例 如果不在棧頂 并且實例存在

會把活著的實例上面的所有activity銷毀 把這個對象露出來 (應用 的主界面可以配置為singleTask)

singleInstance 獨占一個任務棧 這個任務棧中只有一個實例 而且整個手機只有一個實例(慎用 打電 話的界面可以配置為singleInstance)

fragment

1.fragment入門

①創建一個java類 繼承Fragment重寫oncreateView方法

fragment 也會對應一個布局文件 ?這個布局文件可以通過傳入的LayoutInflater加載到界面上 作為oncreateview的返回值

②在布局文件中聲明相應的fragment節點

注意在聲明fragment節點時 ?fragment首字母小寫 ?name 必須制定 內容是要顯示的Fragment的全類名

2.動態替換fragment(常用)

1.創建FirstFramment和second類繼承 重寫 oncreateView 創建布局 更改最小版本為11

在onCreateView 中 inflater.inflate(R.layout.first,null); ?將返回值作為方法的返回值

2.在Activity布局文件中 創建 ViewGroup(LinearLayout)為fragment容器 id為fragment_container

3在activity當中 找到控件 獲取getfragmentManager 通過 fragmentManager 開啟事物 fragmentTransaction

4.通過事務調用.replace();傳入 android.R.id.content,new First 或者 R.id.fragment_container ?再提交.commit

5.getWindManager.GetDefaultDisplay().getWidth /getHeight 如果寬大于高 是橫屏 加載第二個 否則加載第一個

3.兼容低版本的寫法(classMainActivityextendsFragmentActivity)

所有的跟fragement相關的api Fragment FragmentManager v4包中獲取FragmentManager

要使用getSupportFragmentManager 這個方法在 FragmantActivity中才有

FragmentTransaction 都要使用android.support.v4包中的相關類

3.fragment的生命周期

oncreate 當fragment被創建的時候 調用oncreate oncreateView 在這個方法當中加載fragment的布局文件

onpause onStop 處理界面需要顯示的東西 狀態的保存

ondestory 資源的釋放

4.fragment之間的通信

1.新建LeftF與rigntF 重寫..創建布局文件 在LeftF添加按鈕(調用方法) 在rightF添加一個TextView 在主界面中 創建兩個線性布局 權重為1 寬度為0 高速為m并指定id

2.編寫 onCreateView中的返回值 在Activity中getFramentManageer() 再開啟事務.beginTranssaction 調用兩次replace .commit

3.(在Activity中 創建按鈕點擊 彈吐司方法(這里不適宜點擊事件的第四種寫法)) 在leftF中 view.find 設置點擊事件 彈吐司

4.在rightF中 view.find找到text控件 創建修改文字方法 給控件傳文字 ?在Activity中的.replace 中添加 第三個屬性為標簽 ?在leftF中getFM.gFBt(標簽)得到對象后 調用修改文字的方法

Service

特點:

Service 在 Android 中是一種長生命周期的組件,它不實現任何用戶界面,是一個沒有界面的 Activity

Service 和其他組件一樣,都是運行在主線程中,因此不能用它來做耗時的操作 如果要執行耗時操作 需要 在里邊開一個子線程 new Thread(){}.start();

進程特點: 哪個進程被關閉是由安卓系統衡量對用戶相對的重要程度,更容易殺死看不到界面的進程,試圖維持每個進程盡可能的活著,有重要性層級結構.

Foreground process 前臺進程 有Activity正在與用戶交互 service在執行生命周期方法 廣播接收者在執行onreceiver 優先級最高

visible preocess 可視進程 有一個Activity處于可見但不可操作的狀態 比如有個透明應用蓋在上面 處于onPause狀態

Service preocess 服務進程 后臺運行著用startService開啟的服務 沒有組件屬于前兩種情況

Background process 后臺進程 有Activity 處于onStop但是沒有銷毀 沒有其他組件屬于前三種情況 后來進程比較多

哪個先殺死 用LRU算法 最近使用的最后殺 最少使用最先殺

Empty process 空進程

開啟方式:

startService:

startService(Intent) 通過這種方式開啟的服務 執行的聲明周期方法: 第一次調用startService的時候 onCreate()->onStartCommand

再次調用startService ->onstartCommand

想停止用startservice開啟的服務 stopService(intent); stopService 執行之后 service會走 onDestroy()方法 執行之后service銷毀 再次調用stopService沒有反應

如果在activity中通過startService方法開啟一個服務 當activity退出的時候service不會銷毀 依然在后 臺運行

只有手動調用stopService 或者在應用管理器中關閉service 服務才會銷毀

通過startservice可以提高應用的優先級

bindService:(可以調用接口中的方法)

① bindService ?unbindService

② bindservice之后 生命周期 ?onCreate->onBind 多次調用bindService onBind只會執行一次

③ activity退出的時候 必須解除跟service的綁定 ?在ondestroy 的時候調用 unbindService

④ unbindService多次調用會拋異常 只能調用一次

⑤ bindservice的時候傳入第二個參數 是ServiceConnection ?只有當 onBind方法返回不為空的時候 才會調用 onServiceConnected

可以將返回值 service 強轉為 MyBinder 類型(這個類是自己寫的 是 onBind的返回值類) 通過這個對象可以調用接口中的方法

AIDL:

讓其它應用可以調用當前應用service中的方法

RPC remote procedure call 遠程過程調用 ?AIDL 解決就是rpc的問題

IPC inter process communication 進程間通信 每一個android應用都運行在獨立的進程中 所以 應用之間的通信就是進程間通信

Activity intent BroadCastReceiver 通過onReceive方法 可以處理其他應用發來的廣播 通過Intent 攜帶數據

AIDL實現的過程 :

提供遠程服務方法的應用 :

① 創建一個Service 重寫onBind方法 在onBinder中返回一個Binder對象 需要遠程調用的放發放到 這個Binder對象中

②在清單文件中聲明對應的service 需要添加一個intent-filter 可以通過隱式意圖調用service

③ 創建一個接口 需要暴露給其它應用調用的方法都聲明在這個接口中

④把接口文件的擴展名修改為 .aidl 需要注意 aidl文件不支持public 關鍵字

⑤修改service的代碼 讓MyBinder繼承Stub

遠程調用服務的應用

①用過隱式意圖以及bindService方式 開啟遠程的服務

② 創建ServiceConnection的實現類

③在當前應用中創建一個目錄 目錄結構跟提供遠程服務的應用aidl所在目錄結構保持一致, 把aidl文 件copy過來 如果沒有問題 會在gen目錄下生成一個 Iservice.java文件 包名跟aidl文件的包名一致

④在onserviceConnected方法中 通過?把當前的Ibinder對象轉化成遠程服務中的接口類型 最終通過這個對象實現調用遠程方法

LRU 剛用過的最后回收 最早用過的最先回收

BroadcastRecevier

特點:一對多 單向傳遞消息 不需要在清單文件中注冊(動態注冊)

開發過程:

①寫一個類繼承BroadcastReceiver

②重寫onReceive方法

③清單文件注冊(有的時候不能這么搞,需要通過代碼動態注冊) 動態的要求控件活著 才能接收到廣播

④可選 有的廣播接收者需要權限 如果需要權限還得在清單文件中聲明權限

有序廣播和無序廣播的區別:

有序廣播可以被中斷 ?有序廣播的內容可以被修改 ?abordBroadCast(); 如果調用這個方法之后 廣播 中斷了說明是有序廣播

接收有序廣播的時候 聲明priority可以確定接收等級 范圍是0-1000

publicvoidsend(Viewv){

Intentintent=newIntent();

intent.setAction("com.it.sendrice");

//收到廣播時需要的權限

StringreceiverPermission=null;

//作為最終的廣播接受者

BroadcastReceiverresultReceiver=newFinalReceiver();

//最終的廣播接收者 傳null在主線程處理

Handlerscheduler=null;

//數據

StringinitialData="皇帝發放賑災糧 每人一百斤";

sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,Activity.RESULT_OK,initialData,null);

}

無序廣播不能被中斷 ?無序廣播內容不可以修改 ? ? abordBroadCast(); 如果調用之后報紅色日志

publicvoidsendbroadcast(Viewv){

Intentintent=newIntent();

intent.setAction("com.it.broadcast");? //接收廣播程序中注冊的action與這個相同

intent.putExtra("key","hello");

sendBroadcast(intent);

}

廣播攜帶的數據類型:Boolean ? ? Bundle ? ? byte ? ? char ? ?CharSequce ? double ? ? float ? ? int ? ? long ? ?short ? ?string ? Serializable ? ?Parcelable 和其數組

動態注冊廣播接收者:通過在activity 或者 service中調用 registerReceiver方法 注冊廣播接收者

BroadcastReceiverreceiver=newScreenLightRecriver();//這個類為自己創建的

//意圖過濾器

IntentFilterfilter=newIntentFilter();

//意圖過濾器添加ACTION

filter.addAction("android.intent.action.SCREEN_OFF");

filter.addAction("android.intent.action.SCREEN_ON");

//動態注冊一個廣播

registerReceiver(receiver,filter);

動態注冊的廣播接收者:只有調用了注冊的方法之后才能夠收到廣播 靜態注冊廣播接受者 在清單文件中聲明一個receiver節點

除了一些特殊的廣播接收者必須通過 動態方式注冊 只要在清單文件中聲明了對應的receiver 不管應用是否在運行都可以收到廣播

動態注冊的廣播接收者通過當前Activity銷毀的時候需要注銷掉

contentprovider/ contentresolver

內容提供者,內容解析者

意義:跨應用提供數據 讓其他應用訪問本應用數據庫中的內容

實現步驟:

① 創建一個類 繼承ContentProvider 重寫里面方法

② 在清單文件中注冊相應provider ?必須指定authorities 屬性 還要添加一個屬性 exported = true

③ 在provider中處理uri匹配相關內容

創建URI匹配器 在provider 中搞靜態代碼塊 在static代碼塊中添加 uri匹配的規則

根據業務邏輯 在不同的數據庫操作方法中 處理uri匹配的流程

④ 其他應用訪問contentprovider方法

獲得contentresolver內容解析者對象 getContentResolver

通過contentresolver調用 增刪改查 方法訪問contentprovider

需要注意 uri 要以content://開頭 ?具體的路徑 要跟contentprovider中 定義的uri匹配規則匹配上

contentObserver內容觀察者:

在數據內容發生改變的地方通過contentResolver發送數據變化的通知 notifyChange

在需要接受變化的地方 注冊一個內容觀察者(可以在同一個應用中 也可以是在不同的應用中)

①寫一個類繼承ContentObserver 重寫onChange方法

②通過contentResolver 調用registerObserver方法注冊內容觀察者

resolver.registerContentObserver(uri, false, new MyObserver(new Handler()) );

//第一個參數 uri 把內容觀察者注冊到這個uri上 如果有通知 說明這個uri對應的 內容發生改變 內容觀察者就會收到通知

//第二個參數 路徑匹配的規則 如果傳入true 路徑前部分匹配上就可以收到通知 如 果傳false只有整個路徑都匹配上才能收到通知

//第三個參數 內容觀察者

文件的存儲

SharedPrefenrences

可以保存的數據類型比較少 所以 用sp來保存一些簡單的配置信息boolean string int long float Set

①獲取sp的實例 getSharedPreferences("文件名",Mode_private);

②讀內容 getXXXX(key,默認值); 獲取 SharedPreferences的Editor edit(); editor.putXXXX(key,value); commit();提交 只有調用了這個方法 保存的內容才會存到本地

保存位置為包名文件下 一個文件 保存格式為xml格式

上下文獲取(context)

上下文 描述了當前應用的環境

是一個接口 可以通過上下文訪問到跟當前應用相關的資源 資源包括系統的資源(getsystemservice

獲取系統的服務 getwallpaper 獲取壁紙) 也包括應用的私有的資源 ?getAssets 獲取assets目錄下的內容

getResource() 獲取res目錄對應的api 也可以做應用級別的調用 開啟一個activity startActivity ?開啟服務 startService

getFileDir 獲取與應用相關的私有路徑getAbsolutePath()返回抽象路徑名的絕對路徑名字符串

getPackageManags 獲取應用包管理器 getPackageName獲取應用包名

//通過上下文獲取應用相關的私有路徑 不要用寫死路徑的方式

//File file = new File(context.getFilesDir().getAbsolutePath()+"/info.txt");FileOutputStream fos = new FileOutputStream(file);

可以通過這行取代上邊兩行 FileOutputStream fos = context.openFileOutput("info2.txt", Context.MODE_PRIVATE);

//通過上下文的api 獲取到data/data/包名/files目錄下對應文件的 輸入流

FileInputStream fis = context.openFileInput("info2.txt");

sd卡

API=Environment環境 getExternalStprageState 獲取外部存儲器的狀態 MEDIA_MOUNTED 存在并且可讀寫

getExternalStorageDirectory 獲取sD卡的路徑

通過這個api就可以在存儲的時候 Environment.getExternalStorageDirectory(),"info2.txt"

數據庫

第一步: 創建一個類繼承 SQLiteOpenHelper ?并實現父類的構造

第二步 ?從寫onCreate 方法 和onUpgrade 方法

第三步 ?在Activity中 創建MySQLOpenHelper對象( 注意 !!!! 至此并沒有創建數據庫)

第四部 ?調用 MySQLOpenHelper的getReadableDatabase或getWriteableDatabase方法獲 取SQLiteDataBase對象

增加 刪除 改變 使用 execSQL

查詢使用 rawQuery 得到curor 后遍歷

curor相關方法 moveToNext() 移動到下一行 ? ?getCount() 返回查詢到的結果一共有多少行

getColumnCount()返回一條結果中有多少列

getString(index), getInt(index) 根據列序號返回相應記錄(序號從0開始)

或者 ? 使用封裝好的api ? ? ①insert方法 ? ? ? ? ? ? ? ?②delete方法 ? ? ? ? ? ? ? ?③update方法 ? ? ? ? ? ? ? ?④query方法

訪問網絡

獲取&提交數據

servlet 是運行在 Web 服務器中的小型 Java 程序。servlet 通常通過 HTTP(超文本傳輸 協議)接收和響應來自 Web 客戶端的請求。

①創建一個類 繼承HttpServlet ②重寫兩個方法 doGet ?doPost 這兩個方法都接受相同的參數

http協議

HTTP,HyperText Transfer Protocol

超文本傳輸協議 目前使用的版本 1.1 ?每次鏈接之后可以保持鏈接不斷 ?直到所有數據加載完畢之后 再斷開鏈接

之前老版本 1.0 每次連接之后 必須斷開鏈接 內容沒請求完 下次請求還需要創建新的tcp鏈接

http 請求 比如 在瀏覽器中輸入地址 回車 向服務端請求數據 這個操作就是一個http請求

響應 服務端給瀏覽器返回數據就是http響應

請求方式

常用的有兩種 ?put head trace delete

get ? ? ? ①url后面 url和具體的參數用? 不同的提交參數之間 &隔開 key=value

②get方式提交所有的參數都在地址欄中顯示 沒有post安全

③ 瀏覽器對地址欄接受參數的長度有限制 所以get方式不能提交大量數據 (2k~8k) get方式提交參數的長 度<2k 的

post ? ?① 參數的提交是放到請求體中

② 比get方式更安全

③ 提交參數的長度不受限制 ?文件上傳這樣的操作一定要使用post

Handler原理

Handler ?Message ?MessageQueue ?Looper

①Looper 輪詢器 通過Looper去消息隊列取消息 當主線程創建的時候 就會創建一個looper looper在new的時候 會創建一個MessageQueue 所以 一個線程對應一個Looper一個Looper對應一個MessageQueueLooper 創建之后 必須調用loop方法 loop方法中 有一個死循環 這個死循環會不斷去消息隊列里取 消息 取出消息之后 就會調用 handler的handlemessage方法處理消息

②MessageQueue 通過消息隊列 把消息進行排序 排序的依據就是消息要執行的時間

③Handler 用來發送消息 sendMessage->sendMessageAtTime(Message, long uptimeMillis) 第一個參數 要發送的消息 第二個參數 消息要執行的而時間 ?這個時間就是消息在消息隊列中排序的依據sendMessage 最終會調用MessageQueue 的enqueueMessage方法 把消息放到消息隊列進行排序 ? ? ?handler 處理消息 handlerMessage

需要記憶的 刻骨銘心的 ?聯網必須開線程 ?子線程不能更新UIANR 應用沒有響應

(① handler ?② runOnUIThread())

聯網① 需要權限 android.permission.INTERNET

② 用到的基類 HttpURLConnection ?URL url= new URL(String);

url.openConnection();

HttpURLConnection .setRequestMethod()設置請求方法

setConnectTimeOut 設置超時時間

getResponseCode 獲取響應碼

getInputStream 獲取返回的輸入流

handler ?Message msg = Message.obtain(); 獲取消息

msg.obj 通過這個屬性攜帶數據

msg.what 通過這個int變量區分不同消息

handler.sendMessage(Message)

handler.sendEmptyMessage(int what); 發送空消息 runOnUIThread(Runnable );

Bitmap bm =BitmapFactory.decodestream(inputstream) ?從流解析一張圖片

BitmapFactory.decodefile(String path) 從路徑解析圖片

ImageView.setImageBitmap(Bitmap bm ) 給imageview設置圖片

使用httpurlconnection 把數據提交到服務器

get方式提交 跟直接獲取數據不提交參數的時候 區別很小 唯一有不同的地方是 參數要拼接到URL的后面 拼接的時候需要注意 如果有中文的參數 需要進行URL編碼 URLencoder.encode();

post方式提交 需要設置請求頭 Content-Type Content-Length 請求的參數是通過請求體以流的方式提交到服務端的 打開輸出流 setDoOutput(true) 獲取輸出流 ?getOutputStream();

需要注意 請求的參數中如果包含中文內容也需要進行URL編碼

以httpclient方式把數據提交到服務器

①獲取HttpClient 接口 ?找到實現類 Default ?Simple ? Basic Base 找到 無參構造函數 DefaultHttpClient();

②通過請求獲取響應 ? execute(HttpRequest);->httpresponse

③HttpRequest也是接口 發現根據不同的請求方式有對應的實現類 HttpGet HttpPost

多線程下載

①多下程下載的好處 可以突破服務端對單一線程的速度限制

②多線程下載的原理 2.1服務端得支持多線程讀取數據 可以通過Range頭來通知服務端 當前線程請求的數據范圍 conn.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);

range頭成功返回數據 響應碼是206 2.2客戶端通過RandomAccessFile 進行多線程寫 寫的時候調用RandomAccessFile的seek方法

不 同線程移動到不同的位置開始寫文件

①聯網 獲取要下載文件的大小 ②本地創建一個相同大小的文件 ③根據線程的數量和要下載文件的大小計算每個線程要下載的數據范圍

④開啟線程 聯網 拿著計算好的數據范圍到服務端請求數據 ?響應碼206 ⑤通過RandomAccessFile保存文件 調用seek方法

UI相關

listview

ListView 入門

這個控件是用垂直滾動的列表展示條目.由ListAdapter(列表適配器)提供條目.

1.在xml文件中添加ListView控件 添加id 找到控件 設置一個適配器 寫一個類 實現BaseAdapter(接口的抽象類) 重寫4個方法

2.getView方法 通過這個方法創建條目的界面 決定了每一個條目長成什么樣子 新建TextView 設置數據

ListView 優化

1.getCount 方法決定要展示多少條目; convertview 為空表示目前沒有view對象被移出屏幕

2.判斷convertview== null 創建TextView對象展示條目 ?如果不為空 tv_text=()covertView ;

fastScrollEnabled 允許快速滾動

ListView展示數據的原理(MVC)

view 視圖 ? ?controller 控制器 ? model 數據模型

ListView ? ? baseAdapter ? ? ? ? Arraylist

TextView 文本展示

EditText 文本輸入框

Button 按鈕

Imageview 圖片

ImageButton 圖片按鈕

RadioGroup ?與單選按鈕有關

CheckBox ?勾選框booleanchecked?=cb.isChecked()if(checked)?{}else{} 可根據勾選狀態做響應的操作

progressbar ?進度條style="@android:style/Widget.ProgressBar.Horizontal"可設置為橫向的

seekbar可拖動的進度條

AlertDialog 對話框

progressDialog ?進度條

AutocompleteTextView ?自動補全的TextView

Menu 菜單

Surfaceview 視頻

VideoView 視頻

多媒體

圖片處理

通過Matrix 矩陣rotate 旋轉Translate 平移?Scale縮放

每次set后圖片都會恢復 如果想在set基礎上操作 需用post方法

大圖加載:

通過比較圖片分辨率和屏幕分辨率 如果圖片分辨率大 需要進行壓縮,壓縮的大小就是 圖片分辨率和屏幕分辨率寬度和高度的比例

如果inJustDecodeBounds設置為true那么再調用BitmapFactory.decodeXXX方法的時候只會讀取圖片的寬度和高度

//取寬度和高度計算出來的比例的最大值 作為壓縮的大小

option.inSampleSize = Math.max(Math.round(heightIndex), Math.round(widthIndex));

option.inJustDecodeBounds = false;

創建圖片副本:

//通過BitmapFactory加載圖片

//創建出一張跟原圖一樣大的空白圖片 這個圖片可以修改 ?mutable

Bitmap bm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());

//通過canvas畫圖canvas.drawBitmap(bitmap, matrix, paint);

音頻視頻的播放

MediaPlayer播放:

new MediaPlayer();

player.setDataSource("mnt/sdcard/xpg.mp3");//設置數據源

player.prepare();player.start();

Surfaceview播放

VideoView 播放

Vitamio播放動畫:導入開源項目

動畫

Animation and Graphics Overview 通過安卓提供的api讓ui動起來 也可以畫 2d或者3D動畫 3.0之后加入了屬性動畫

幀動畫 Drawable Animation

補間動畫view Animation

使用xml方式定義補間動畫 ①在res目錄下創建一個anim目錄 在里面聲明xml文件

②在代碼中使用animationUtils.loadAnimation加載需要注意 補間動畫/view動畫 不會改變控件的位置

屬性動畫property Animation (android 3.0之后加入)

屬性動畫 確實修改了控件的屬性 如果使用的屬性動畫 看到控件位置改變了 實際的位置也改變了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,761評論 25 708
  • 最近剛從舊公司離職,為面試在做準備,因為平時開發CV大法用得比較多,很多基礎知識掌握得不是很牢靠以及很多工具框架只...
    黎清海閱讀 2,223評論 1 19
  • “我們到了一個略顯尷尬的年紀,不再那么年輕了卻也沒有足夠的成長;想依靠自己卻發現還差一點;想要往前走卻發現前路漫漫...
    張果果灬閱讀 275評論 0 0
  • 一級標題 二級標題 三級標題 正文:你好,我在練習寫作。 方法一 方法二 策略一 鏈接 書寫的力量 圖片 引用 老...
    睿思客閱讀 203評論 0 1
  • 廢話 由于工作原因,經常需要做服務端與客戶端的交互測試,判斷分析問題點。話說這種問題看似簡單,實際過程中,比較容易...
    舌尖上的大胖閱讀 323評論 0 1