在很多時候需要更換頭像或者選擇圖片,所以這裡總結下實現選擇並編輯圖片然後設置成頭像的方法,下麵開始: 整體結構如下: 創建項目,命名為ChooseImage_test 創建完成,在drawable-hdip文件夾中添加一張預設頭像圖片,用於在用戶選擇頭像之前顯示或者當用戶未選擇頭像時做預設頭像: 創 ...
在很多時候需要更換頭像或者選擇圖片,所以這裡總結下實現選擇並編輯圖片然後設置成頭像的方法,下麵開始:
整體結構如下:
創建項目,命名為ChooseImage_test
創建完成,在drawable-hdip文件夾中添加一張預設頭像圖片,用於在用戶選擇頭像之前顯示或者當用戶未選擇頭像時做預設頭像:
創建佈局文件
這裡為了貼合實際,整個頁面就只有一個ImageView,當然現在是矩形的ImageView顯示頭像,後面會結合設置圓形頭像的功能實現圓形頭像選擇功能
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ImageView
android:id="@+id/iv_icon"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="110dp"
android:background="@drawable/default_icon" />
</RelativeLayout>
在MainActivity.java中進行主要邏輯編寫
初始化ImageView組件
public class MainActivity extends Activity {
private ImageView iv_icon = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_icon = (ImageView) findViewById(R.id.iv_icon);
}
}
設置ImageView的點擊事件
這裡的點擊事件為:當點擊頭像彈出一個對話框,讓用戶選擇是使用本地圖庫的圖片作為頭像還是使用拍照作為頭像
iv_icon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
彈出對話框
這裡將彈出提示框封裝成了一個chooseDialog()方法
private void chooseDialog() {
new AlertDialog.Builder(this)//
.setTitle("選擇頭像")//
.setNegativeButton("相冊", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("拍照", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).show();
}
創建工具類ImageUtils.java
在工具類中主要實現通過不同方式(拍照或相冊)進行圖片獲取併進行剪裁圖片和保存圖片的功能
申明變數和構造方法
public final static int ACTIVITY_RESULT_CAMERA = 0001;//選擇 拍照 的返回碼
public final static int ACTIVITY_RESULT_ALBUM = 0002;//選擇 相冊 的返回碼
public Uri photoUri;// 圖片路徑的URI
private Uri tempUri;
private File picFile;// 圖片文件
private Context context;
// 構造方法
public ImageUtils(Context context) {
super();
this.context = context;
}
創建方法byCamera()用於選擇拍照的方式
主要步驟已在代碼中寫明,這裡就不再贅述
// 選擇拍照的方式
public void byCamera() {
try {
// 創建文件夾
File uploadFileDir = new File(
Environment.getExternalStorageDirectory(), "/icon");
if (!uploadFileDir.exists()) {
uploadFileDir.mkdirs();
}
// 創建圖片,以當前系統時間命名
picFile = new File(uploadFileDir,
SystemClock.currentThreadTimeMillis() + ".png");
if (!picFile.exists()) {
picFile.createNewFile();
}
// 獲取到圖片路徑
tempUri = Uri.fromFile(picFile);
// 啟動Camera的Intent,傳入圖片路徑作為存儲路徑
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
//啟動Intent
((MainActivity) context).startActivityForResult(cameraIntent,
ACTIVITY_RESULT_CAMERA);
System.out.println("-->tempUri : " + tempUri.toString()
+ "-->path:" + tempUri.getPath());
} catch (ActivityNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
創建方法byAlbum()用於選擇相冊的方式
如上,主要步驟已在代碼中寫明,這裡就不再贅述
// 選擇相冊的方式
public void byAlbum() {
try {
// 創建文件夾
File pictureFileDir = new File(
Environment.getExternalStorageDirectory(), "/icon");
if (!pictureFileDir.exists()) {
pictureFileDir.mkdirs();
}
// 創建圖片,以當前系統時間命名
picFile = new File(pictureFileDir,
SystemClock.currentThreadTimeMillis() + ".png");
if (!picFile.exists()) {
picFile.createNewFile();
}
// 獲取到圖片路徑
tempUri = Uri.fromFile(picFile);
// 獲得剪輯圖片的Intent
final Intent intent = cutImageByAlbumIntent();
((MainActivity) context).startActivityForResult(intent,
ACTIVITY_RESULT_ALBUM);
} catch (Exception e) {
e.printStackTrace();
}
}
創建方法cutImageByAlbum()用於返回一個調用系統剪輯圖片的Intent
具體參數設置就不再贅述
// 調用圖片剪輯程式的Intent
private Intent cutImageByAlbumIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
intent.putExtra("noFaceDetection", true);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
return intent;
}
創建方法cutImageByCamera()用於通過拍照後調用圖片剪輯
//通過相機拍照後進行剪輯
public void cutImageByCamera() {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(tempUri, "image/*");
intent.putExtra("crop", "true");
//設定寬高比
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//設定剪裁圖片寬高
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
((MainActivity) context).startActivityForResult(intent,
ACTIVITY_RESULT_ALBUM);
}
創建方法decodeBitmap()方法將文件編碼成Bitmap
// 對圖片進行編碼成Bitmap
public Bitmap decodeBitmap() {
Bitmap bitmap = null;
try {
if (tempUri != null) {
photoUri = tempUri;
bitmap = BitmapFactory.decodeStream(context
.getContentResolver().openInputStream(photoUri));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
}
在對話框的點擊按鈕中添加事件
“相冊”的點擊事件
.setNegativeButton("相冊", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
imageUtils.byAlbum();
}
})
“拍照”的點擊事件
.setPositiveButton("拍照", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED)) {//判斷是否存在SD卡
imageUtils.byCamera();
}
}
})
在mainActivity.java中重寫onActivityResult()方法用於根據傳回的參數進行相關設定
// 這裡需要註意resultCode,正常情況返回值為 -1 沒有任何操作直接後退則返回 0
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("-->requestCode:" + requestCode + "-->resultCode:"
+ resultCode);
switch (requestCode) {
case ImageUtils.ACTIVITY_RESULT_CAMERA: // 拍照
try {
if (resultCode == -1) {
imageUtils.cutImageByCamera();
} else {
// 因為在無任何操作返回時,系統依然會創建一個文件,這裡就是刪除那個產生的文件
if (imageUtils.picFile != null) {
imageUtils.picFile.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
break;
case ImageUtils.ACTIVITY_RESULT_ALBUM:
try {
if (resultCode == -1) {
Bitmap bm_icon = imageUtils.decodeBitmap();
if (bm_icon != null) {
iv_icon.setImageBitmap(bm_icon);
}
} else {
// 因為在無任何操作返回時,系統依然會創建一個文件,這裡就是刪除那個產生的文件
if (imageUtils.picFile != null) {
imageUtils.picFile.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
以上,整個過程就完成了,運行效果圖如下:
選擇圖片作為頭像的功能基本實現,附上完整源碼:
MainActivity.Java
package com.example.chooseimage_test;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv_icon = null;
private ImageUtils imageUtils = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv_icon = (ImageView) findViewById(R.id.iv_icon);
// 初始化工具類的實例
imageUtils = new ImageUtils(this);
iv_icon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
chooseDialog();
}
});
}
private void chooseDialog() {
new AlertDialog.Builder(this)//
.setTitle("選擇頭像")//
.setNegativeButton("相冊", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
imageUtils.byAlbum();
}
})
.setPositiveButton("拍照", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED)) {// 判斷是否存在SD卡
imageUtils.byCamera();
}
}
}).show();
}
// 這裡需要註意resultCode,正常情況返回值為 -1 沒有任何操作直接後退則返回 0
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("-->requestCode:" + requestCode + "-->resultCode:"
+ resultCode);
switch (requestCode) {
case ImageUtils.ACTIVITY_RESULT_CAMERA: // 拍照
try {
if (resultCode == -1) {
imageUtils.cutImageByCamera();
} else {
// 因為在無任何操作返回時,系統依然會創建一個文件,這裡就是刪除那個產生的文件
if (imageUtils.picFile != null) {
imageUtils.picFile.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
break;
case ImageUtils.ACTIVITY_RESULT_ALBUM:
try {
if (resultCode == -1) {
Bitmap bm_icon = imageUtils.decodeBitmap();
if (bm_icon != null) {
iv_icon.setImageBitmap(bm_icon);
}
} else {
// 因為在無任何操作返回時,系統依然會創建一個文件,這裡就是刪除那個產生的文件
if (imageUtils.picFile != null) {
imageUtils.picFile.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
ImageUtils.java
package com.example.chooseimage_test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.os.SystemClock;
import android.provider.MediaStore;
public class ImageUtils {
public final static int ACTIVITY_RESULT_CAMERA = 0001;//選擇 拍照 的返回碼
public final static int ACTIVITY_RESULT_ALBUM = 0002;//選擇 相冊 的返回碼
public Uri photoUri;// 圖片路徑的URI
private Uri tempUri;
public File picFile;// 圖片文件
private Context context;
// 構造方法
public ImageUtils(Context context) {
super();
this.context = context;
}
// 選擇拍照的方式
public void byCamera() {
try {
// 創建文件夾
File uploadFileDir = new File(
Environment.getExternalStorageDirectory(), "/icon");
if (!uploadFileDir.exists()) {
uploadFileDir.mkdirs();
}
// 創建圖片,以當前系統時間命名
picFile = new File(uploadFileDir,
SystemClock.currentThreadTimeMillis() + ".png");
if (!picFile.exists()) {
picFile.createNewFile();
}
// 獲取到圖片路徑
tempUri = Uri.fromFile(picFile);
// 啟動Camera的Intent,傳入圖片路徑作為存儲路徑
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
//啟動Intent
((MainActivity) context).startActivityForResult(cameraIntent,
ACTIVITY_RESULT_CAMERA);
System.out.println("-->tempUri : " + tempUri.toString()
+ "-->path:" + tempUri.getPath());
} catch (ActivityNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 選擇相冊的方式
public void byAlbum() {
try {
// 創建文件夾
File pictureFileDir = new File(
Environment.getExternalStorageDirectory(), "/icon");
if (!pictureFileDir.exists()) {
pictureFileDir.mkdirs();
}
// 創建圖片,以當前系統時間命名
picFile = new File(pictureFileDir,
SystemClock.currentThreadTimeMillis() + ".png");
if (!picFile.exists()) {
picFile.createNewFile();
}
// 獲取到圖片路徑
tempUri = Uri.fromFile(picFile);
// 獲得剪輯圖片的Intent
final Intent intent = cutImageByAlbumIntent();
((MainActivity) context).startActivityForResult(intent,
ACTIVITY_RESULT_ALBUM);
} catch (Exception e) {
e.printStackTrace();
}
}
// 調用圖片剪輯程式的Intent
private Intent cutImageByAlbumIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
//設定寬高比
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//設定剪裁圖片寬高
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 200);
intent.putExtra("noFaceDetection", true);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
return intent;
}
//通過相機拍照後進行剪輯
public void cutImageByCamera() {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(tempUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 100);
intent.putExtra("outputY", 100);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
((MainActivity) context).startActivityForResult(intent,
ACTIVITY_RESULT_ALBUM);
}
// 對圖片進行編碼成Bitmap
public Bitmap decodeBitmap() {
Bitmap bitmap = null;
try {
if (tempUri != null) {
photoUri = tempUri;
bitmap = BitmapFactory.decodeStream(context
.getContentResolver().openInputStream(photoUri));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
}
}
到此,基本完成選擇頭像的功能,下一篇文章將總結做成圓形頭像的方法。