即时聊天中的更换头像功能

摘自:bmob即时通讯个人资料编辑,源码猛击这里



很多人想知道即时聊天的拍照做图像和相册选择做图像的功能怎么实现,这里。我通过拆分bmob即时聊天的案例,介绍大家怎么实现这种功能。


首先我们点击头像弹出上图的窗口,我们用到了PopupWindow,把代码封装成一个方法,代码如下:
        /**
         * 弹出选择窗口
         * @param view 要弹出来的view
         */
        private void showPopupWindow(View view) {
                avatorPop = new PopupWindow(view, mScreenWidth, 600);
                avatorPop.setTouchInterceptor(new OnTouchListener() {
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                                        avatorPop.dismiss();
                                        return true;
                                }
                                return false;
                        }
                });


                avatorPop.setWidth(WindowManager.LayoutParams.MATCH_PARENT);
                avatorPop.setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
                avatorPop.setTouchable(true);
                avatorPop.setFocusable(true);
                avatorPop.setOutsideTouchable(true);
                avatorPop.setBackgroundDrawable(new BitmapDrawable());
                // 动画效果 从底部弹起
                avatorPop.setAnimationStyle(R.style.Animations_GrowFromBottom);
                avatorPop.showAtLocation(layout_all, Gravity.BOTTOM, 0, 0);
        }




那么,拍照和相册,现在我们是点击其中一项做相应的动作。也相应封装成一个方法:


        RelativeLayout layout_choose;
        RelativeLayout layout_photo;
        PopupWindow avatorPop;


        public String filePath = "";


        private void showAvatarPop() {
                //弹出窗口的布局文件,转化成view
                View view = LayoutInflater.from(this).inflate(R.layout.pop_showavator,
                                null);
                //实例化选择相册按钮
                layout_choose = (RelativeLayout) view.findViewById(R.id.layout_choose);
                //实例化选择拍照按钮
                layout_photo = (RelativeLayout) view.findViewById(R.id.layout_photo);
                layout_photo.setOnClickListener(new OnClickListener() {


                        @Override
                        public void onClick(View arg0) {
                                ShowLog("点击拍照");
                                //点击时的背景的改变
                                layout_choose.setBackgroundColor(getResources().getColor(
                                                R.color.base_color_text_white));
                                layout_photo.setBackgroundDrawable(getResources().getDrawable(
                                                R.drawable.pop_bg_press));
                                File dir = new File(Environment.getExternalStorageDirectory()+"/avatar/");
                                if (!dir.exists()) {
                                        dir.mkdirs();
                                }
                                // 原图
                                File file = new File(dir, new SimpleDateFormat("yyMMddHHmmss")
                                                .format(new Date()));
                                // 获取相片的保存路径
                                filePath = file.getAbsolutePath();
                                //将图片转化成uri
                                Uri imageUri = Uri.fromFile(file);


                                //跳转到系统的相机拍照
                                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                                
//                                public static final int REQUESTCODE_UPLOADAVATAR_CAMERA = 1;//拍照修改头像
                                startActivityForResult(intent,
                                                BmobConstants.REQUESTCODE_UPLOADAVATAR_CAMERA);
                        }
                });
                layout_choose.setOnClickListener(new OnClickListener() {


                        @Override
                        public void onClick(View arg0) {
                                ShowLog("点击相册");
                                //点击相册时的背景改变
                                layout_photo.setBackgroundColor(getResources().getColor(
                                                R.color.base_color_text_white));
                                layout_choose.setBackgroundDrawable(getResources().getDrawable(
                                                R.drawable.pop_bg_press));
                                //跳转到相册
                                Intent intent = new Intent(Intent.ACTION_PICK, null);
                                intent.setDataAndType(
                                                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                                
//                                public static final int REQUESTCODE_UPLOADAVATAR_LOCATION = 2;//本地相册修改头像
                                startActivityForResult(intent,
                                                BmobConstants.REQUESTCODE_UPLOADAVATAR_LOCATION);
                        }
                });


                //调用showPopupWindow方法
                showPopupWindow(view);
        }




我们不管是拍照还是选择相册,我们都是通过调用系统的程序来实现的,拍照之后或者选择相册之后,会返回数据回来,所以我要用startActivityForResult将返回的数据得到。




        Bitmap newBitmap;
        boolean isFromCamera = false;// 区分拍照旋转
        int degree = 0;




        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
                // TODO Auto-generated method stub
                super.onActivityResult(requestCode, resultCode, data);
                switch (requestCode) {
              // 拍照修改头像
                case BmobConstants.REQUESTCODE_UPLOADAVATAR_CAMERA:
                        if (resultCode == RESULT_OK) {
                                if (!Environment.getExternalStorageState().equals(
                                                Environment.MEDIA_MOUNTED)) {
                                        ShowToast("SD不可用");
                                        return;
                                }
                                isFromCamera = true;
                                File file = new File(filePath);
                                //degree = PhotoUtil.readPictureDegree(file.getAbsolutePath());
                                //Log.i("life", "拍照后的角度:" + degree);
                               //进行裁剪
                                startImageAction(Uri.fromFile(file), 200, 200,
                                                BmobConstants.REQUESTCODE_UPLOADAVATAR_CROP, true);
                        }
                        break;
                 // 本地修改头像
                case BmobConstants.REQUESTCODE_UPLOADAVATAR_LOCATION:
                        if (avatorPop != null) {
                                avatorPop.dismiss();
                        }
                        Uri uri = null;
                        if (data == null) {
                                return;
                        }
                        if (resultCode == RESULT_OK) {
                                if (!Environment.getExternalStorageState().equals(
                                                Environment.MEDIA_MOUNTED)) {
                                        ShowToast("SD不可用");
                                        return;
                                }
                                isFromCamera = false;
                                uri = data.getData();
                                startImageAction(uri, 200, 200,
                                                BmobConstants.REQUESTCODE_UPLOADAVATAR_CROP, true);
                        } else {
                                ShowToast("照片获取失败");
                        }


                        break;
                 // 裁剪头像返回
                case BmobConstants.REQUESTCODE_UPLOADAVATAR_CROP:
                        // TODO sent to crop
                        if (avatorPop != null) {
                                avatorPop.dismiss();
                        }
                        if (data == null) {
                                // Toast.makeText(this, "取消选择", Toast.LENGTH_SHORT).show();
                                return;
                        } else {
                                saveCropAvator(data);
                        }
                        // 初始化文件路径
                        filePath = "";
                        // 上传头像
                        uploadAvatar();
                        break;
                default:
                        break;


                }
        }




从代码中可以看出,拍照成功或者选择相片后,进行照片的裁剪startImageAction。裁剪的动作也封装成一个方法




        /**
         * @Title: 进行照片的裁剪
         * @return void
         * @throws
         */
        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);
        }




裁剪之后,我们requestCode的requestCode是照片裁剪的public static final int REQUESTCODE_UPLOADAVATAR_CROP = 3;裁剪成功对应的是BmobConstants.REQUESTCODE_UPLOADAVATAR_CROP的处理,那么在case BmobConstants.REQUESTCODE_UPLOADAVATAR_CROP中,我们可以看到saveCropAvator和uploadAvatar两个方法,这两个方法呢分别是保存头像和上传头像到服务器的方法,代码如下:
/**
* 保存裁剪的头像

* @param data
*/
private void saveCropAvator(Intent data) {
Bundle extras = data.getExtras();
if (extras != null) {
//得到返回来的数据,是bitmap类型的数据
Bitmap bitmap = extras.getParcelable("data");
Log.i("life", "avatar - bitmap = " + bitmap);
if (bitmap != null) {
bitmap = PhotoUtil.toRoundCorner(bitmap, 10);
if (isFromCamera && degree != 0) {
                                        //将图片转化成圆角图片
bitmap = PhotoUtil.rotaingImageView(degree, bitmap);
}
iv_set_avator.setImageBitmap(bitmap);
// 保存图片
String filename = new SimpleDateFormat("yyMMddHHmmss")
.format(new Date())+".png";
path = BmobConstants.MyAvatarDir + filename;
PhotoUtil.saveBitmap(BmobConstants.MyAvatarDir, filename,
bitmap, true);
// 上传头像
if (bitmap != null && bitmap.isRecycled()) {
bitmap.recycle();
}
}
}
}




/**
* 将图片变为圆角

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


保存完剪裁的头像之后,把头像上传到服务器。


        //bmob服务器上传文件操作
private void uploadAvatar() {
final BmobFile bmobFile = new BmobFile(new File(path));
bmobFile.upload(this, new UploadFileListener() {


@Override
public void onSuccess() {
// TODO Auto-generated method stub
                                //得到文件的路径
String url = bmobFile.getFileUrl(SetMyInfoActivity.this);
// 更新BmobUser对象
updateUserAvatar(url);
}


@Override
public void onProgress(Integer arg0) {
// TODO Auto-generated method stub


}


@Override
public void onFailure(int arg0, String msg) {
// TODO Auto-generated method stub
ShowToast("头像上传失败:" + msg);
}
});
}
       //将上传的图片文件地址值(路径)赋值给该用户
private void updateUserAvatar(final String url) {
User  u =new User();
u.setAvatar(url);
updateUserData(u,new UpdateListener() {
@Override
public void onSuccess() {
// TODO Auto-generated method stub
ShowToast("头像更新成功!");
// 更新头像
refreshAvatar(url);
}


@Override
public void onFailure(int code, String msg) {
// TODO Auto-generated method stub
ShowToast("头像更新失败:" + msg);
}
});
}


上传之后,就是更新当前头像了


/**
* 更新头像 refreshAvatar

* @return void
* @throws
*/
private void refreshAvatar(String avatar) {
if (avatar != null && !avatar.equals("")) {
                       //iv_set_avator是显示头像的imageview
ImageLoader.getInstance().displayImage(avatar, iv_set_avator,
ImageLoadOptions.getOptions());
} else {
iv_set_avator.setImageResource(R.drawable.default_head);
}
}


好了。到这里,从选择照片还是拍照,到上传文件更新头像的步骤就全部搞定了。还有什么不懂的话。就下载源码进行研究把。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/56260.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot + Spring Security多种登录方式:账号+微信网页授权登录

大家好,我是宝哥! 一、概述 实现账号用户名微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号、密码。 二、准备工作 要实现该功能,首先需要掌…

CnOpenDataA股上市公司交易所监管措施数据

一、数据简介 证券市场监管是指证券管理机关运用法律的、经济的以及必要的行政手段,对证券的募集、发行、交易等行为以及证券投资中介机构的行为进行监督与管理。 我国《证券交易所管理办法》第十二条规定,证券交易所应当按照章程、协议以及业务规则的规…

四套上市公司家族、股权关联数据助力公司金融深度研究

四套上市公司家族关联数据:家族企业在我国上市公司中占有庞大比例,已经成为推动我国经济高质量发展的动力之一。家族企业作为民营经济的重要组成部分,在我国的GDP增长、税收以及就业等方面做出的贡献不容小觑。上市公司家族企业的关联、融资、…

新手练习2:人物模型多边形建模流程图解

一,核心布线篇 1,打开Blender,新建一个“常规”文件,按Tab键对立方体进行调整, 2, 按 ~ 键切换视图,按快捷键1切换顶点,选择左边顶点删除,对其添加镜像修改器&#xff0…

CI 与 CD 持续集成与交付(2)

在CI 与 CD持续集成与交付(1)http://t.csdn.cn/TF3zC 里面简述了要持续集成要哪些基本工具和和工具安装使用,下面我用实验验证 jenkins 怎么去集成这3大工具的使用 第一步先下载Jenkins的war 包 java -jar jenkins.war 启动 Jenkins web应…

快讯 | 低成本开源聊天机器人Vicuna;首批因 AI 失业的人出现

一分钟速览新闻点 首批因 AI 失业的人出现,某游戏公司裁掉半数原画师西安交大开发出基于多功能智能皮肤的自适应变色系统术锐机器人完成数亿元C3轮融资,手术机器人成资本香饽饽谷歌称其 AI 超算系统比英伟达 A100 更快、更节能ChatGPT已经恢复Plus订阅服…

服装连锁店管理系统设计与实现

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字):

基于SSM 技术的服装店管理系统

随着各个服装公司的发展,以及现在的客流量的增加,很多的服装公司的内容管理系统出现了很多的问题,比如说系统的服务不全面,系统高峰时期出现卡顿等一些体验不是十分好的现象。本次毕业设计从服装行业的本身需求出发,服装公司内部的…

基于SSMEasyUI的西服门店管理系统-java门店管理服装管理系统

基于SSM&EasyUI的西服门店管理系统-java门店管理服装管理系统 1.包含源程序,数据库脚本。代码和数据库脚本都有详细注释。2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善开发环境:Eclipse ,MYSQL,JDK1.7,Tomcat 7涉及技术点&…

服装店小程序商城开发,有效帮助门店增加私域流量,提升门店销量

文/江苏微微小程序开发 线下服装店普遍遭遇获客难的问题,主要原因是店铺曝光不足,受限于地理位置,和线上电商冲击。 开发服装小程序商城,可以很好地扩大店铺曝光半径,利用小程序中的附近的小程序功能,服装…

服装租赁与买卖系统设计

其他项目,点击作者主页 目录 1 系统简介 2 系统相关技术 2.1 Java 2.2 MySql数据库 2.3 MyEclipse技术 2. 4 Tomcat服务器 3 需求分析 3.1 系统可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 社会可行性 3.2 系统功能需求分析 4 系统…

服装零售软件大合集,你想知道的都在这里!

最近总是听到服装零售店老板的诉苦: 1、一年四季更换,服装零售店面临着换季更替,潮流迭代,于是也承担着巨额的库存成本,加上当前运输成本不断上涨,店铺支出压力越来越大,服装零售店的库存消化能…

推荐一款可以设计衣服的软件?零基础小白不可错过的服装设计工具

推荐一款可以设计衣服的手机软件?服装设计中设计绘画是个很重要的步骤,服装画主要是表达设计师所设计的时装整体效果及感觉,通过设计来表达设计师的设计理念及风格,其中包括对衣服的设计、面料、廓形等等的表达所以对于服装设计的…

衣橱管理APP——《衣橱管家》页面设计

目录 一、界面总体设计二、详细界面说明1.登录注册2.日历3.智能推荐4.我的5.衣橱6.时尚 三、附录 一、界面总体设计 《衣橱管家》有五大核心模块:衣橱管理、智能穿搭推荐、智能购买推荐、时尚社区、日常穿搭记录;界面设计将围绕这五大核心模块与登录注册…

服装店商家不离手的十大服装进销存管理软件,功能大对比

随着管理成本的提高,加上信息技术的发展,各行各业都要求应用专业的技术软件来提高管理效率,中小商户也不例外。 进销存软件是时代的产物,也是中小商户们想要做大做强生意的必然要求。然而市面上的进销存软件高达上百款&#xff0…

中小型服装店如何选择管理软件?

中小型服装店在发展中逐渐建立属于门店的会员管理、员工管理、商品管理体系,使用管理软件来提高门店经营效率,那么选择服装店管理软件要看哪些方面? 小编给大家一些中小型服装店选择软件时考虑的方面: 软件价格。中小型门店服装店规模小&…

基于C#的服装店进销存管理系统设计与实现

目 录 第一章 前言 1 1.1 选题背景 1 1.2 毕业论文的主要内容 1 第二章 服装连锁管理系统开发环境 3 2.1 开发环境选择 3 2.2 代码管理工具 3 2.3 项目代码命名空间规划 3 2.4 系统结构分析 4 第三章 服装连锁管理系统数据库设计 6 3.1 数据库的选择 6 3.2 系统数据库的设计 6 …

服装店如何建立系统的会员制度?

服装店要在竞争中立于不败之地,就要让自己的经营管理适应现代竞争的需要。服装店的核心就是会员,要不断开发新顾客,并维护老顾客。使单个顾客创造的利润最大化,并且能够长期循环,是服装店老板最想看到的。 会员制&…

服装实体店运营需要的所有软件,合集在此!(建议收藏)实体店运营 实体店运营干货 实体店运营全流程所需系统推荐

随着信息化普及程度越来越高,各行各业的运转速度都在加快,做生意的老板们也开始发现,单靠以前的人工管理已经完全不够用了。 尤其是服装实体店,款式分类多,库存又容易挤压,更加需要有科学的手段去管控日常的…

Python-裁判文书网

开门见山,直入主题,好久没更新了,搞一搞, 就来个 --裁判文书网 fiddler抓包: 打开fiddler 然后访问裁判文书网并选择筛选条件 整理下fiddler 删除一些干扰的链接,如:图片,css等等。 然后来分…