Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android入門--實現選擇並編輯圖片設置成頭像,

Android入門--實現選擇並編輯圖片設置成頭像,

編輯:關於android開發

Android入門--實現選擇並編輯圖片設置成頭像,


在很多時候需要更換頭像或者選擇圖片,所以這裡總結下實現選擇並編輯圖片然後設置成頭像的方法,下面開始: 
整體結構如下: 
這裡寫圖片描述

創建項目,命名為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;
    }
}

到此,基本完成選擇頭像的功能,下一篇文章將總結做成圓形頭像的方法。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved