android头像设置:从本地照片库或拍照获取并剪裁

功能介绍

制作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 ([email protected]) 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 ([email protected])
 * 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;
        }
    }
}

时间: 2024-08-03 11:18:06

android头像设置:从本地照片库或拍照获取并剪裁的相关文章

Android模拟器设置网络代理方法

在服务器上启动模拟器的时候加了--http-proxy,但是不起作用.所以搜了下面的方法 四种方法: 一:将网络连接代理设置写入配置数据库 (适合启动模拟器无界面) 1.通过命令行或者通过双击emulatoer可执行文件,打开模拟器 2.在命令行执行adb shell 打开android的控制台 (确保环境变量设置正确,即已经把Android_SDK/tools 添加到了PATH(Linux)/path(Windows)) 3.执行 ls -l /data/data/com.android.pr

Android闹钟设置的解决方案

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深.下面记录一下,我解决Android闹钟设置的解决方案. 主要问题 API19开始AlarmManager的机制修改. 应用程序被Kill掉后,设置的闹钟不响. 6.0以上进入Doze模式会使JobScheduler停止工作. 手机设置重启后,闹钟失效问题. API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一

【转】Android中设置TextView的颜色setTextColor

原文网址:http://www.cnblogs.com/myphoebe/archive/2012/01/06/2314728.html android中设置TextView的颜色有方法setTextColor,这个方法被重载了,可以传入两种参数. public void setTextColor(int color) { mTextColor = ColorStateList.valueOf(color); updateTextColors(); } public void setTextCo

android手机设置虚拟网络的步骤

上个周五参加麦子学院班会的时候,android开发老师葛老师讲到android手机设置虚拟网络的问题,她说在android手机使用中,经常会需要设置虚拟网络,下面我就给大家回顾一下麦子学院android开发老师讲的虚拟网络的设置,来看看具体设置步骤: 第一步,打开手机主菜单,选择"设置",然后选择"无线和网络" 第二步:选择"虚拟专用网设置" 第三步:选择"添加虚拟专用网" 第四步:选择"添加L2TP/IPSec P

android WIFI 设置代理代码 4.4.3——5.0

记录下android中设置代理代码 或许有朋友能用的上 适用于4.4.3 在5.0上android.net.ProxyProperties 找不到 估计API被谷歌拿掉了 4.4.4还没试估计API还在 private static String NOTPROXY = ""; //不走代理名单 private static List<String> list; //type为1设置wifi设置 为0是清除代理 public static void setWifi(Conte

Android如何设置TextView的行间距、行高。

     Android系统中TextView默认行间距比较窄,不美观.     我们可以设置每行的行间距,可以通过属性android:lineSpacingExtra或android:lineSpacingMultiplier来做. 在你要设置的TextView中加入如下代码: 1.android:lineSpacingExtra 设置行间距,如"8dp". 2.android:lineSpacingMultiplier 设置行间距的倍数,如"1.5″.       示例:

Android 批量设置监听器,监听器传递参数,重写监听器构造函数

这个问题困扰了我好几天,就在我做的课程表应用中,每个页面有15个TextView,每个都要设置监听器,但是这还不是难事,难的是,用匿名内部类实现监听借口的时候,还要再在里面设置监听器!简而言之,TextView长按变为EditText,EditText点击完成之后把值传回TextView,这一个地方需要两个监听器. 我最早的实现方法是(mon_tv[ ]是一个TextView数组,mon_et[ ]是一个EditText数组): mon_tv[1].setOnLongClickListener(

Android TextView 设置行间距的问题 (setLineSpacing ,lineSpacingExtra, lineSpacingMultiplier)

最近的项目中,需要用到自定义控件.有个组件要获取绘制文本的高度,翻开TextView 的源码,有个方法 getLineHeight() public int getLineHeight() { return FastMath.round(mTextPaint.getFontMetricsInt(null) * mSpacingMult + mSpacingAdd); } getLineHeight 的注释如下: /** * @return the height of one standard l

Android如何设置TextView的行间距、行高

原文来自:你我学习网: 链接地址:http://www.niwoxuexi.com/blog/android/article/222.html Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距, 可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier. 关于Android下TextView中文换行问题,可查看Android自定义view-文本自动换行. 1.android:lin