• (转)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;
            }
        }
    }
  • 相关阅读:
    用asp.net(C#)写的论坛
    javascript:window.history.go(1)什么意思啊?
    5个有趣的 JavaScript 代码片段
    marquee属性的使用说明
    flash网站欣赏
    获取验证码程序
    ACCESS中执行sql语句
    靠谱的工程师
    mysql变量(用户+系统)
    理解进程和线程
  • 原文地址:https://www.cnblogs.com/zzw1994/p/5128195.html
Copyright © 2020-2023  润新知