当前位置: 代码迷 >> Android >> (转)android头像设立:从本地照片库或拍照获取并剪裁
  详细解决方案

(转)android头像设立:从本地照片库或拍照获取并剪裁

热度:79   发布时间:2016-04-24 11:54:23.0
(转)android头像设置:从本地照片库或拍照获取并剪裁

本文转载于:http://blog.csdn.net/sheeprunning/article/details/9184021

功能介绍

        制作android应用时,用户注册的功能必不可少,往往还需要具备用户头像的编辑功能,设置过程如下图:

        界面设计

        建立一个缩略图ImageView,点击时,弹出设置头像的对话框,设置完成后,刷新缩略图;

  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:background="#F3F1DA"    android:orientation="vertical" >    <!-- title -->    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:background="@drawable/title_bg"        android:gravity="center"        android:orientation="horizontal" >        <TextView            android:layout_width="fill_parent"            android:layout_height="wrap_content"            android:gravity="center"            android:text="@string/title_bar_txt"            android:textColor="@android:color/white" />    </LinearLayout>    <!-- image switch -->    <RelativeLayout        android:id="@+id/switch_face_rl"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:layout_margin="20dip"        android:background="@drawable/item_edit_bg"        android:clickable="true"         android:padding="5dip" >        <ImageView            android:id="@+id/face"            android:layout_width="42dip"            android:layout_height="42dip"            android:layout_alignParentLeft="true"            android:layout_marginLeft="10dip"            android:src="@drawable/mini_avatar" />        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="5dip"            android:layout_marginTop="5dip"            android:layout_toRightOf="@id/face"            android:layout_gravity="center"            android:text="点击设置头像"            android:textColor="@android:color/black" />     </RelativeLayout></LinearLayout>

 Activity设计

 MainActivity.java:

package com.xzw.picture;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import com.xzw.utils.Tools;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.util.Log;import android.view.View;import android.view.Window;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.Toast;/** *  * @author XuZhiwei (xuzw13@gmail.com) Create at 2012-8-17 上午10:14:40 */public class MainActivity extends Activity {    /* 组件 */    private RelativeLayout switchAvatar;    private ImageView faceImage;    private String[] items = new String[] { "选择本地图片", "拍照" };    /* 头像名称 */    private static final String IMAGE_FILE_NAME = "faceImage.jpg";    /* 请求码 */    private static final int IMAGE_REQUEST_CODE = 0;    private static final int CAMERA_REQUEST_CODE = 1;    private static final int RESULT_REQUEST_CODE = 2;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉标题        setContentView(R.layout.main);        switchAvatar = (RelativeLayout) findViewById(R.id.switch_face_rl);        faceImage = (ImageView) findViewById(R.id.face);        // 设置事件监听        switchAvatar.setOnClickListener(listener);    }    private View.OnClickListener listener = new View.OnClickListener() {        @Override        public void onClick(View v) {            showDialog();        }    };    /**     * 显示选择对话框     */    private void showDialog() {        new AlertDialog.Builder(this)                .setTitle("设置头像")                .setItems(items, new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        switch (which) {                        case 0:                            Intent intentFromGallery = new Intent();                            intentFromGallery.setType("image/*"); // 设置文件类型                            intentFromGallery                                    .setAction(Intent.ACTION_GET_CONTENT);                            startActivityForResult(intentFromGallery,                                    IMAGE_REQUEST_CODE);                            break;                        case 1:                            Intent intentFromCapture = new Intent(                                    MediaStore.ACTION_IMAGE_CAPTURE);                            // 判断存储卡是否可以用,可用进行存储                            if (Tools.hasSdcard()) {                               File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);                               File file = new File(path,IMAGE_FILE_NAME);                                intentFromCapture.putExtra(                                        MediaStore.EXTRA_OUTPUT,                                        Uri.fromFile(file));                            }                            startActivityForResult(intentFromCapture,CAMERA_REQUEST_CODE);                            break;                        }                    }                })                .setNegativeButton("取消", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        dialog.dismiss();                    }                }).show();    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        //结果码不等于取消时候        if (resultCode != RESULT_CANCELED) {            switch (requestCode) {            case IMAGE_REQUEST_CODE:                startPhotoZoom(data.getData());                break;            case CAMERA_REQUEST_CODE:                if (Tools.hasSdcard()) {                   File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);                   File tempFile = new File(path,IMAGE_FILE_NAME);                    startPhotoZoom(Uri.fromFile(tempFile));                } else {                    Toast.makeText(MainActivity.this, "未找到存储卡,无法存储照片!",Toast.LENGTH_LONG).show();                }                break;            case RESULT_REQUEST_CODE: //图片缩放完成后                if (data != null) {                    getImageToView(data);                }                break;            }        }        super.onActivityResult(requestCode, resultCode, data);    }    /**     * 裁剪图片方法实现     *      * @param uri     */    public void startPhotoZoom(Uri uri) {        Intent intent = new Intent("com.android.camera.action.CROP");        intent.setDataAndType(uri, "image/*");        // 设置裁剪        intent.putExtra("crop", "true");        // aspectX aspectY 是宽高的比例        intent.putExtra("aspectX", 1);        intent.putExtra("aspectY", 1);        // outputX outputY 是裁剪图片宽高        intent.putExtra("outputX", 340);        intent.putExtra("outputY", 340);        intent.putExtra("return-data", true);        startActivityForResult(intent, RESULT_REQUEST_CODE);    }    /**     * 保存裁剪之后的图片数据     *      * @param picdata     */    private void getImageToView(Intent data) {        Bundle extras = data.getExtras();        if (extras != null) {            Bitmap photo = extras.getParcelable("data");            Drawable drawable = new BitmapDrawable(this.getResources(),photo);            faceImage.setImageDrawable(drawable);        }    }}

 

  Tools.java

package com.xzw.utils;import android.os.Environment;/** *  * @author XuZhiwei (xuzw13@gmail.com) * Create at 2012-8-17 上午10:14:40 */public class Tools {    /**     * 检查是否存在SDCard     * @return     */    public static boolean hasSdcard(){        String state = Environment.getExternalStorageState();        if(state.equals(Environment.MEDIA_MOUNTED)){            return true;        }else{            return false;        }    }}

 

  相关解决方案