Android实现类似换QQ头像功能(图片裁剪)

现在几乎所有的App都有用户登录模块,需要设置用户头像,而关于用户头像部分无疑也是比较头疼的,目前大部分应用的头像部分会有两种方式:一种是利用系统的裁剪功能去获取用户头像,一种就是获取到图片或者照片的地址后自定义头像裁剪界面。而我这里提供了一种利用系统的裁剪功能来获取头像的写法,当然我写的这个只是实现一个简单地功能,比较简单。如果大家有比较好的写法可以和我交流下。

没图说个JB,先看看效果:

首先是打开系统相册,实现代码:

Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CON   TENT_URI, "image/*");
startActivityForResult(intent,2);

通过onActivityResult方法得到返回的intent数据:

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);        switch (requestCode) {        case 2:            if (layout_pop != null) {
                layout_pop.dismiss();
            }
            Uri uri = null;            if (data == null) {                return;
            }            if (resultCode == RESULT_OK) {                if (!Environment.getExternalStorageState().equals(
                        Environment.MEDIA_MOUNTED)) {
                    Toast.makeText(this, "SD不可用",1).show();                    return;
                }                uri = data.getData();
                startImageAction(uri, 200, 200,3, true);
            } else {
                Toast.makeText(this, "照片获取失败",1).show();
            }            break;            case 3:                if (layout_pop != null) {
                    layout_pop.dismiss();
                }                if (data == null) {
                    return;
                } else {
                    saveCropAvator(data);
                }                break;        default:            break;
        }
    }

图像裁剪实现代码:

private void startImageAction(Uri uri, int outputX, int outputY,            int requestCode, boolean isCrop) {
        Intent intent = null;        if (isCrop) {
            intent = new Intent("com.android.camera.action.CROP");
        } else {
            intent = new Intent(Intent.ACTION_GET_CONTENT, null);
        }
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", outputX);
        intent.putExtra("outputY", outputY);
        intent.putExtra("scale", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        intent.putExtra("return-data", true);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection        startActivityForResult(intent, requestCode);
    }

对头像裁剪过后,还需要将图片变为圆角,处理方法为:

/**
     * 将图片变为圆角
     * 
     * @param bitmap
     *            原Bitmap图片
     * @param pixels
     *            图片圆角的弧度(单位:像素(px))
     * @return 带有圆角的图片(Bitmap 类型)     */
    public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                bitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(output);        final int color = 0xff424242;        final Paint paint = new Paint();        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());        final RectF rectF = new RectF(rect);        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);        return output;
    }

最后保存图片:

 /**
     * 保存裁剪的头像
     * 
     * @param data     */
    private void saveCropAvator(Intent data) {
        Bundle extras = data.getExtras();        if (extras != null) {
            Bitmap bitmap = extras.getParcelable("data");
            Log.i("life", "avatar - bitmap = " + bitmap);            if (bitmap != null) {
                bitmap = toRoundCorner(bitmap, 10);//调用圆角处理方法                headImageView.setImageBitmap(bitmap);                if (bitmap != null && bitmap.isRecycled()) {
                    bitmap.recycle();
                }
            }
        }
    }
时间: 2024-08-09 09:53:30

Android实现类似换QQ头像功能(图片裁剪)的相关文章

Android自定义控件实例,圆形头像(图库 + 裁剪+设置),上传头像显示为圆形,附源码

Android项目开发中经常会遇见需要实现圆角或者圆形的图片功能,如果仅仅使用系统自带的ImageView控件显然无法实现此功能,所以通过系列文章的形式由简到繁全方位的介绍一下此功能的实现,巩固一下自身的学习,同时,和广大网友交流分享 本项目源码下载地址:链接:http://pan.baidu.com/s/1sljdvtF 密码:xj85 首先看效果图 首先看一下CircleImageView的主要流程 1. 首先通过setImageXxx()方法设置图片Bitmap: 2. 进入构造函数Cir

android 用户头像,图片裁剪,上传并附带用户数据base64code 方式

图片上传的文件流我上一篇博客写了,这一篇我们说一下base64,base64上传方式就是将图片转换成base64码,然后把base64码以字符串的方式上传,然后服务器接收到以后再解码就可以了,相对于文件流来说比较简单: 用户头像上传我们首先要获得图片的url然后再裁剪图片,然后把裁剪后的图片转换成base64然后在上传: 下边是安卓端代码: 首先我们要获得裁剪后的图片:一,选择图片: 代码如下,通过对话框选择获得图片的方式: activity: /* * 提示对话框 */ private voi

Android图片裁剪功能——调用系统裁剪

花了两天时间看了下android的图片裁剪功能的实现.其实刚开始做这个我挺虚的,以为整个功能都需要自己写出来,但查了些资料,发现android已经提供了裁剪功能,需要的话自己调用就成了.soga,这下轻松多了. 首先推荐几篇博客 Android大图片裁剪终极解决方案 要想弄明白裁剪功能,这系列博客非常重要,你可以不看我下面总结的,但你一定要看他这系列的几篇文章. Android 图片裁剪功能实现详解(类似QQ自定义头像裁剪) 这篇也不错,比较喜欢他的注释.虽然也有些误导,比如说他有一段对setD

Android学习之 换肤功能模块的实现<二>

在上篇中 主要有学习到皮肤资源内置到应用程序中 的方式实现换肤的 基本思路,本篇将继续以上篇的思路学习 皮肤资源内置的方式实现换肤效果.但本篇侧重于应用中换肤功能的代码设计实现上!切换的皮肤资源位于assets下不同的皮肤资源文件夹中. 本篇demo程序的代码结构如下: 本篇实现换肤功能的代码设计 UML类图如下: 本篇demo的换肤效果如下:               主要的实现代码在于: 1.SkinConfigManager.java 作用:皮肤配置管理,封装了SharedPrefere

Android学习之 换肤功能模块的实现<二>

在上篇中 主要有学习到皮肤资源内置到应用程序中 的方式实现换肤的 基本思路,本篇将继续以上篇的思路学习 皮肤资源内置的方式实现换肤效果.但本篇側重于应用中换肤功能的代码设计实现上.切换的皮肤资源位于assets下不同的皮肤资源目录中. 本篇demo程序的代码结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuaWNlMDUyOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissol

用JQuery仿造QQ头像裁剪功能

原文:用JQuery仿造QQ头像裁剪功能 最近工作真心忙碌,几乎没时间写博客.今天趁周末来仿一个QQ头像裁剪功能插件.效果如下: 所有文件都可在我的Github上下载,从头到尾从简到繁按步骤一共分了9个HTML文件,每个步骤文件里的注释都写的很清楚,故在本博客内不赘述. 原理: 主要是通过css的clip来裁剪图片可视区域,拖动剪裁窗口这里使用了JQ-UI的draggable插件(但是缩放没有,贪方便可以使用Resizable插件,但都用插件的话就没有研究的意义了). 缩放功能原理其实很简单,不

可在广域网部署运行的QQ高仿版 -- GG叽叽V3.5,增加自拍头像功能、细节优化(源码)

距离上次发版本(GG叽叽V3.4,增加系统设置.最近联系人.群功能)又有1个月了,在这个月内,由于空闲时间不是很多,所以,GG增加的主要功能只是拍照并设定其为自己头像.修改密码.删除好友.以及一些bug的修改.我试着列了一下接下来GG要优化的地方,总共达20多条,看来GG离一个正式的产品还有很长的路要走.慢慢来吧! 一.GG V3.5 新增功能展现 1.自拍头像 2.修改密码 3.删除好友 4.其它 (1)主窗口允许改变大小. (2)修复bug:聊天发消息时,如果截图很大,对方就收不到. (3)

Android下自写类似系统wifi管理功能的实现

经常有人问到关于Android下WIFI管理的问题,询问个中归于wifi的操作,下面我就写写如何在Android下实现类似Android系统自带wifi管理功能的步骤,通过这个的学习,相信关于android下wifi的操作,我们基本都能掌握了: 第一.说说界面布局 界面很简单: 顶部一个刷新按钮和一个WIFI开关 下部一个listview,每一行就是一个扫描到的wifi信息,显示它的SSID.加密类型,信号强度,是否已经连接 第二.关于列表的获取 如何获取wifi扫描列表呢?wifiManage

腾讯大牛动态教学:Android 仿微信 QQ 图片裁剪,赶紧收藏起来!

前言 在平时开发中,经常需要实现这样的功能,拍照 - 裁剪,相册 - 裁剪.当然,系统也有裁剪的功能,但是由于机型,系统兼容性等问题,在实际开发当中,我们通常会自己进行实现.今天,就让我们一起来看看怎样实现. 这篇博客实现的功能主要有仿微信,QQ 上传图像裁剪功能,包括拍照,从相册选取.裁剪框的样式有圆形,正方形,九宫格. 主要讲解的功能点 使用说明 整体的实现思路 裁剪框的实现 图片缩放的实现,包括放大,缩小,移动,裁剪等 我们先来看看我们实现的效果图 使用说明 有两种调用方式 第一种 第一种