編輯:關於Android編程
前言——項目中需要用到對用戶頭像的裁剪和上傳功能。關於裁剪,一開始是想自己來做,但是覺得這個東西應該谷歌有開發吧,於是一搜索官方文檔,果然有。於是,就果斷無恥地用了Android自帶有關於照片的自由裁剪。因為時間太緊,雖然不太華麗,但是勝在能用,節省時間嘛。
具體是通過 Intent的action來實現的。
關鍵代碼如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">public void imageCut(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); //開啟裁剪功能 intent.putExtra("crop", "true"); //設定寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); //設定裁剪圖片寬高 intent.putExtra("outputX", 100); intent.putExtra("outputY", 100); //要求返回數據 intent.putExtra("return-data", true); startActivityForResult(intent, 100); }
返回數據後直接在onActivityResult裡對返回的圖片數據進行顯示就行了,這裡由於剪切後的圖片較小,個人覺得應該不用考慮OOM的問題,問題是,在調用自帶的裁剪功能的時候,由於沒看源碼,所以不知道在調整裁剪框的時候,顯示的那副圖片有沒有進行壓縮,如果沒有進行壓縮,那麼當圖片很大的時候,加載起來就很容易出現OOM了,明顯對此由於是調用官方的API,我沒有方法去解決它。唯一的辦法就是不用它,而是自己去寫一個,就可以避免這個問題。利用如下的代碼進行壓縮,很好地避免OOM問題。
/* * 壓縮圖片,返回的是壓縮後的照片 */ public static Bitmap revitionImage(String path,int size){ Bitmap bitmap = null; try { //先用圖片路徑打開圖片文件,緩沖到一個緩存輸入流中 BufferedInputStream in = new BufferedInputStream(new FileInputStream( new File(path))); //用參數代表變量來記錄當前照片的信息,比如圖片大小 BitmapFactory.Options options = new BitmapFactory.Options(); //把inJustDecodeBounds設置為true,則完全不用分配內存就可以得到給位圖文件bitmap的信息, //如此得到大小後,就可以對其進行7壓縮,然後在內存中生成一個更小的bitmap,節省了內存 options.inJustDecodeBounds = true; //譯碼位圖文件,只為了得到原圖的信息 BitmapFactory.decodeStream(in ,null,options); //記得關閉流 in.close(); int i = 0; while(true){ //右移i位是因為下面的pow取一半了,新生成的圖片是原來的二分之一 if (((options.outWidth >> i)<=size) && ((options.outHeight >> i) <=size)) { //這時候應取得照片了 in = new BufferedInputStream(new FileInputStream(new File(path))); //pow是次方方法,2的i次方,inSampleSize圖片均分取樣值,例如 //inSampleSize == 4 returns an image that is 1/4 the width/height of the original, and 1/16 the number of pixels. options.inSampleSize = (int)Math.pow(2.0, i); //這時候的圖片已經符合我們設定的256大小了,所以要在設置false,允許輸出,創建圖片 //真正地生成一個有像素的,經過縮放的bitmap options.inJustDecodeBounds = false; bitmap = BitmapFactory.decodeStream(in,null,options);//獲得n分之一原圖,小於256*256 break; }else { i++; } } } catch (IOException e) { Log.i(TAG, "壓縮圖片出錯"+e.toString()); } return bitmap; }
最後只能先用著了,有時間再深究或者自己折騰一個。下面是效果圖,看著還行。
下面是一個關於本主題的DEMO。有需要的童鞋可以去看看。
DEMO例子下載
如何用ES文件浏覽器查看wifi密碼。ES文件浏覽器是一個能管理手機本地、局域網共享、FTP和藍牙文件的管理器。其實就是一個電腦和手機網絡文件傳輸軟件。可大
.xml代碼如下: 顯示如下:
前言相信大家都知道知道,在AndroidOS中,提供了五中數據存儲方式,分別是:ContentProvider存儲、文件存儲、SharedPreference存儲、SQL
1、View和ViewRootViewRoot從名稱上來理解似乎是“View樹的根”,這很容易讓人產生誤解。因為ViewRoot並不屬於View樹