zoukankan      html  css  js  c++  java
  • android 设置头像以及裁剪功能

    在android的开发过程中,经常遇到设置用户头像以及裁剪图像大小的功能。昨天我遇到了设置用户头像的功能,开始不知道怎么搞,在技术群里问也没人回 答,就研究了微信用户设置头像的功能,了解到用户设置图像的过程,就是两步点击设置头像,选择头像资源的来源,相册和相机两个来得到。
         闲话说的有点多了,来说说技术点吧。其实也比较简单,就是通过Intent来启动相册或者相机就可以了。
    看下效果图:

    代码如下:

    package com.xzw.picture;
    
    import java.io.File;
    
    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.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()) {
    
                                                                    intentFromCapture.putExtra(
                                                                                    MediaStore.EXTRA_OUTPUT,
                                                                                    Uri.fromFile(new File(Environment
                                                                                                    .getExternalStorageDirectory(),
                                                                                                    IMAGE_FILE_NAME)));
                                                            }
    
                                                            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) {
                    switch (requestCode) {
                    case IMAGE_REQUEST_CODE:
                            startPhotoZoom(data.getData());
                            break;
                    case CAMERA_REQUEST_CODE:
                            if (Tools.hasSdcard()) {
                                    File tempFile = new File(
                                                    Environment.getExternalStorageDirectory()
                                                                    + 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", 320);
                    intent.putExtra("outputY", 320);
                    intent.putExtra("return-data", true);
                    startActivityForResult(intent, 2);
            }
    
            /**
             * 保存裁剪之后的图片数据
             *
             * @param picdata
             */
            private void getImageToView(Intent data) {
                    Bundle extras = data.getExtras();
                    if (extras != null) {
                            Bitmap photo = extras.getParcelable("data");
                            Drawable drawable = new BitmapDrawable(photo);
                            faceImage.setImageDrawable(drawable);
                    }
            }
    
    }

    还有一个工具类:

    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;
                    }
            }
    }

    以上就是实现的代码!
          以上代码有个bug,及时你在点击选择图片的过程中,突然间不想设置头像了,点击返回会出现异常
       那是因为你取消的过程中,没有返回任何值,就出现了NullPointEXcetpion的异常,所以我们需要判断一下用户是否取消了操作。
      代码贴出关键代码如下:

                      //结果码不等于操作取消时候
                    if (resultCode != RESULT_CANCELED) {
    
                            switch (requestCode) {  
                                        ..........
                            }
                    }
  • 相关阅读:
    [动图演示]Redis 持久化 RDB/AOF 详解与实践
    挑战10个最难的Java面试题(附答案)【上】
    Python使用psutil模块,做你的电脑管家
    在线工具 正则表达式
    [USACO09JAN]Earthquake Damage
    [USACO09MAR]Moon Mooing
    [HNOI2005]汤姆的游戏
    [SDOI2010]大陆争霸
    [USACO08NOV]Cheering up the Cow
    [USACO08NOV]lites
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4796864.html
Copyright © 2011-2022 走看看