調用android系統的圖庫以及截圖來讓用戶自定義界面背景

                     關鍵代碼只有幾行,下面是具體的項目實踐

第一步:

/**
	 * 調用系統圖庫來讓用戶自定義背景圖片
	 */
	private void setingBackground() {
		
		
		// 從圖庫選擇圖片
		System.out.println("---------------------------------------從圖庫選擇圖片");
		Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"

		innerIntent.setType("image/*"); // 查看類型

		// StringIMAGE_UNSPECIFIED="image/*";詳細的類型在com.google.android.mms.ContentType中

		Intent wrapperIntent = Intent.createChooser(innerIntent, null);

		startActivityForResult(wrapperIntent, SETINGBACKGROUND);
	}


第二步:

                    

然而,這是在我缺少附加的文檔,不知道這些選項的具體含義等等情況之下的選擇。所以,我將我的yanj整理成一個表格 ,並寫了一個演示程序,力圖演示控制此功能的所有可供選項。

你可以在你的程序中使用使用我的代碼,並且擴展它。我會將之附加在這篇文章上。

Exta Options Table for image/* crop:

                                                      附加選項          數據類型          描述 
                                                       crop                   String               發送裁剪信號 
                                                       aspectX             int                     X方向上的比例 
                                                       aspectY              int                    Y方向上的比例 
                                                       outputX               int                    裁剪區的寬
                                                       outputY                int                    裁剪區的高
                                                       scale                    boolean          是否保留比例
return-data boolean 是否將數據保留在Bitmap中返回
data Parcelable 相應的Bitmap數據
circleCrop String 圓形裁剪區域?
MediaStore.EXTRA_OUTPUT ("output") URI 將URI指向相應的file:///...,詳見代碼示例

現在,最令人困惑的是MediaStore.EXTRA_OUTPUT以及return-data選項。

你主要有兩種方式從這個Intent中取得返回的bitmap:獲取內部數據或者提供一個Uri以便程序可以將數據寫入。

 

 /**
	 * 返回後接收並調用系統裁剪工具 在裁剪圖片時,遇到有些圖片不能按照某一指定的比例進行裁剪,查看了源碼後才知道:
	 * 系統的裁剪圖片默認對圖片進行人臉識別,當識別到有人臉時,會按aspectX和aspectY爲1來處理,
	 * 如果想設置成自定義的裁剪比例,需要設置noFaceDetection爲true。
	 * 
	 * 即iintent.putExtra("noFaceDetection", true); 取消人臉識別功能。
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode,
			Intent intent) {
		System.out.println("requestCode="+requestCode+",resultCode="+resultCode+",intent="+intent);
		System.out
				.println("-----------------------------------------得到返回的圖片uri");
		if (requestCode == SETINGBACKGROUND) {
			if (intent != null) {
				Uri uri = intent.getData();
				
				if (uri != null) {
					
					//依照需求進行分辨時需要橫屏還是豎屏進行截取
					int width = getWindowManager().getDefaultDisplay().getWidth();
					int height = getWindowManager().getDefaultDisplay().getHeight();
					
					final Intent intent1 = new Intent(
							"com.android.camera.action.CROP");
					intent1.setDataAndType(uri, "image/*");
					intent1.putExtra("crop", "true");
					intent1.putExtra("aspectX", 1);
					intent1.putExtra("aspectY", 1);
					
					if(screenType){
						//需要是豎屏
						intent1.putExtra("outputX", width);
						intent1.putExtra("outputY", height);
					}
					else{
						//需要的是橫屏
						intent1.putExtra("outputX", height);
						intent1.putExtra("outputY", width);
					}
					intent1.putExtra("return-data", true);
					intent1.putExtra("noFaceDetection", true);
					startActivityForResult(intent1, TAILOR_IMAGE);

				}
			}
		}


		else if (requestCode == TAILOR_IMAGE) {
			System.out
					.println("----------------------------------------------得到裁剪後的圖片");
			if (intent != null) {
				Bitmap bm = intent.getParcelableExtra("data");
				
				//立即修改背景
				BitmapDrawable drawable = new BitmapDrawable(bm);
				layout_left.setBackgroundDrawable(drawable);
				
				String path = null;
				//看需求是需要橫屏還是豎屏,true爲豎屏
				if(screenType){
					if(whatActivity){
						//歌曲界面
						path = ConstantValue.MusicVertical;
					}
					else{
						//歌詞界面
						path = ConstantValue.LyricVertical;
					}
					
				}
				else{
					//橫屏路徑
					path = ConstantValue.horizontal;
				}
				
				File file = new File(path);
				
				try {
					file.delete();
					file.createNewFile();
					ByteArrayOutputStream baos = new ByteArrayOutputStream();
			        bm.compress(Bitmap.CompressFormat.JPEG, 80, baos);
			        baos.flush();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章