關鍵代碼只有幾行,下面是具體的項目實踐
第一步:
/**
* 調用系統圖庫來讓用戶自定義背景圖片
*/
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();
}
}
}
}