Android 仿QQ讨论组头像

一、效果图


二、实现

基本实现过程:

1.将原图片读取为bitmap

2.在Canvas画布上计算出图片位置,并绘制新的图片。

(ps:计算位置对我来说是难点,花了好长时间);

三、源码

1.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="16dp"android:background="#AEAEAE"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="horizontal"><ImageViewandroid:id="@+id/img_src_0"android:layout_width="0dp"android:layout_height="match_parent"android:padding="5dp"android:layout_weight="1"android:adjustViewBounds="true"/><ImageViewandroid:id="@+id/img_src_1"android:layout_width="0dp"android:layout_height="match_parent"android:padding="5dp"android:layout_weight="1"android:adjustViewBounds="true"/><ImageViewandroid:id="@+id/img_src_2"android:layout_width="0dp"android:layout_height="match_parent"android:padding="5dp"android:layout_weight="1"android:adjustViewBounds="true"/><ImageViewandroid:id="@+id/img_src_3"android:layout_width="0dp"android:layout_height="match_parent"android:padding="5dp"android:layout_weight="1"android:adjustViewBounds="true"/><ImageViewandroid:id="@+id/img_src_4"android:layout_width="0dp"android:layout_height="match_parent"android:padding="5dp"android:layout_weight="1"android:adjustViewBounds="true"/></LinearLayout><ImageViewandroid:id="@+id/img_result_2"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><ImageViewandroid:id="@+id/img_result_3"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><ImageViewandroid:id="@+id/img_result_4"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><ImageViewandroid:id="@+id/img_result_5"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/>
</LinearLayout>




2.Activity

package com.hand.px_demo.QQHead;import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;import com.hand.px_demo.R;import java.util.ArrayList;/*** Created by panx on 2016/12/12.*/
public class QHeadActivity extends Activity{private ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();private ImageView img_src_0;private ImageView img_src_1;private ImageView img_src_2;private ImageView img_src_3;private ImageView img_src_4;private ImageView img_result_2;private ImageView img_result_3;private ImageView img_result_4;private ImageView img_result_5;private HeadManager headManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_qq_head);headManager = new HeadManager();initView();initData();}private void initView(){img_src_0 = (ImageView)findViewById(R.id.img_src_0);img_src_1 = (ImageView)findViewById(R.id.img_src_1);img_src_2 = (ImageView)findViewById(R.id.img_src_2);img_src_3 = (ImageView)findViewById(R.id.img_src_3);img_src_4 = (ImageView)findViewById(R.id.img_src_4);img_result_2 = (ImageView)findViewById(R.id.img_result_2);img_result_3 = (ImageView)findViewById(R.id.img_result_3);img_result_4 = (ImageView)findViewById(R.id.img_result_4);img_result_5 = (ImageView)findViewById(R.id.img_result_5);}private void initData(){//从drawable中获取图片资源的bitmapResources r = this.getResources();Bitmap bitmap0 = BitmapFactory.decodeResource(r,R.drawable.src_head_1);Bitmap bitmap1 = BitmapFactory.decodeResource(r,R.drawable.src_head_2);Bitmap bitmap2 = BitmapFactory.decodeResource(r,R.drawable.src_head_3);Bitmap bitmap3 = BitmapFactory.decodeResource(r,R.drawable.src_head_4);Bitmap bitmap4 = BitmapFactory.decodeResource(r,R.drawable.src_head_5);bitmaps.add(bitmap0);bitmaps.add(bitmap1);bitmaps.add(bitmap2);bitmaps.add(bitmap3);bitmaps.add(bitmap4);img_src_0.setImageBitmap(bitmap0);img_src_1.setImageBitmap(bitmap1);img_src_2.setImageBitmap(bitmap2);img_src_3.setImageBitmap(bitmap3);img_src_4.setImageBitmap(bitmap4);Bitmap r2Bitmap = headManager.getBitMap(bitmaps, 2);Bitmap r3Bitmap = headManager.getBitMap(bitmaps, 3);Bitmap r4Bitmap = headManager.getBitMap(bitmaps, 4);Bitmap r5Bitmap = headManager.getBitMap(bitmaps, 5);img_result_2.setImageBitmap(r2Bitmap);img_result_3.setImageBitmap(r3Bitmap);img_result_4.setImageBitmap(r4Bitmap);img_result_5.setImageBitmap(r5Bitmap);}}


3.绘制图片的核心代码

(1)压缩图片

  /*对原始图片进行缩放*/public Bitmap zoomImage(Bitmap bgimage, double newWidth,double newHeight) {// 获取这个图片的宽和高float width = bgimage.getWidth();float height = bgimage.getHeight();// 创建操作图片用的matrix对象Matrix matrix = new Matrix();// 计算宽高缩放率float scaleWidth = ((float) newWidth) / width;float scaleHeight = ((float) newHeight) / height;// 缩放图片动作matrix.postScale(scaleWidth, scaleHeight);Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,(int) height, matrix, true);return bitmap;}


(2)将图片改成圆角


private Bitmap makeRoundCorner(Bitmap bitmap, int width, int height) {int left = 0, top = 0, right = width, bottom = height;float roundPx = height / 2;if (width > height) {left = (width - height) / 2;top = 0;right = left + height;bottom = height;} else if (height > width) {left = 0;top = (height - width) / 2;right = width;bottom = top + width;roundPx = width / 2;}Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(output);int color = 0xff424242;Paint paint = new Paint();Rect rect = new Rect(left, top, right, bottom);RectF rectF = new RectF(rect);paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);return output;}



(3)获取绘制的坐标

private ArrayList<Point> getFivePoints(int point_x, int point_y, int d) {ArrayList<Point> points = new ArrayList<Point>();//圆心至图片的距离int wr = point_y - d;//大圆心至小圆心的距离int R = wr + d / 2;//头像半径,头像直径为dint r = d / 2;int RCos18 = (int) (R * (Math.cos(0.1 * Math.PI)));int RSin18 = (int) (R * (Math.sin(0.1 * Math.PI)));int RCos36 = (int) (R * (Math.cos(0.2 * Math.PI)));int RSin36 = (int) (R * (Math.sin(0.2 * Math.PI)));Point point1 = new Point(point_x - r, 0);Point point2 = new Point();point2.x = RCos18 + point_x - r;point2.y = point_y - RSin18 - r;Point point3 = new Point();point3.x = RSin36 + point_x - r;point3.y = point_y + RCos36 - r;Point point4 = new Point();point4.x = point_x - RSin36 - r;point4.y = point3.y;Point point5 = new Point();point5.x = point_x - (int) (RCos18) - r;point5.y = point2.y;points.add(point1);points.add(point2);points.add(point3);points.add(point4);points.add(point5);return points;}



(4) 该类全部源码



package com.hand.px_demo.QQHead;import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;import com.hand.px_demo.R;import java.util.ArrayList;/*** Created by panx on 2016/12/12.*/
public class QHeadActivity extends Activity{private ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();private ImageView img_src_0;private ImageView img_src_1;private ImageView img_src_2;private ImageView img_src_3;private ImageView img_src_4;private ImageView img_result_2;private ImageView img_result_3;private ImageView img_result_4;private ImageView img_result_5;private HeadManager headManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_qq_head);headManager = new HeadManager();initView();initData();}private void initView(){img_src_0 = (ImageView)findViewById(R.id.img_src_0);img_src_1 = (ImageView)findViewById(R.id.img_src_1);img_src_2 = (ImageView)findViewById(R.id.img_src_2);img_src_3 = (ImageView)findViewById(R.id.img_src_3);img_src_4 = (ImageView)findViewById(R.id.img_src_4);img_result_2 = (ImageView)findViewById(R.id.img_result_2);img_result_3 = (ImageView)findViewById(R.id.img_result_3);img_result_4 = (ImageView)findViewById(R.id.img_result_4);img_result_5 = (ImageView)findViewById(R.id.img_result_5);}private void initData(){//从drawable中获取图片资源的bitmapResources r = this.getResources();Bitmap bitmap0 = BitmapFactory.decodeResource(r,R.drawable.src_head_1);Bitmap bitmap1 = BitmapFactory.decodeResource(r,R.drawable.src_head_2);Bitmap bitmap2 = BitmapFactory.decodeResource(r,R.drawable.src_head_3);Bitmap bitmap3 = BitmapFactory.decodeResource(r,R.drawable.src_head_4);Bitmap bitmap4 = BitmapFactory.decodeResource(r,R.drawable.src_head_5);bitmaps.add(bitmap0);bitmaps.add(bitmap1);bitmaps.add(bitmap2);bitmaps.add(bitmap3);bitmaps.add(bitmap4);img_src_0.setImageBitmap(bitmap0);img_src_1.setImageBitmap(bitmap1);img_src_2.setImageBitmap(bitmap2);img_src_3.setImageBitmap(bitmap3);img_src_4.setImageBitmap(bitmap4);Bitmap r2Bitmap = headManager.getBitMap(bitmaps, 2);Bitmap r3Bitmap = headManager.getBitMap(bitmaps, 3);Bitmap r4Bitmap = headManager.getBitMap(bitmaps, 4);Bitmap r5Bitmap = headManager.getBitMap(bitmaps, 5);img_result_2.setImageBitmap(r2Bitmap);img_result_3.setImageBitmap(r3Bitmap);img_result_4.setImageBitmap(r4Bitmap);img_result_5.setImageBitmap(r5Bitmap);}}


demo地址:https://github.com/panxu/demo.git

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

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

相关文章

仿照微信或qq头像双击摇晃效果

1.资源文件anim下加入 cycles_anim.xml (插值器可以设置不同的插值器) <?xml version"1.0" encoding"utf-8"?> <cycleInterpolator xmlns:android"http://schemas.android.com/apk/res/android"android:cycles"2" />an…

Android之头像图片变圆形

一&#xff1a;效果图、 二&#xff1a;实现步骤、 1.自定义一个转换工具类、 package com.common.base.util;import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapShader; import an…

Android 高仿微信群聊头像

最近小编搞了一个仿微信群聊头像的一个功能&#xff0c;分享给大家...工作中需要实现仿钉钉群头像的一个功能&#xff0c;就是个人的头像拼到一起显示&#xff0c;看了一下市场上的APP好像微信的群聊头像是组合的&#xff0c;QQ的头像不是&#xff0c;别的好像也没有了。今天给…

QQ头像无法加载,显示初始默认头像的解决方法

前言 终于。。终于&#xff01;查过那么多资料&#xff0c;翻过无数带有蛛丝马迹的信息&#xff0c;根本没有人能解决我遇到的这个问题&#xff0c;它是如此独特&#xff0c;如此难以排查&#xff01;&#xff01; 删过文件、改过网络配置、本地测试过相关数据接口、重装过QQ、…

软考-数据库系统工程师

软考之数据库系统工程师 前言 怎么会突然想起来考这个呢&#xff1f;说实话很惭愧&#xff0c;大学四年&#xff0c;毕业两年多都不知道有这个证书&#xff0c;也是今天看朋友圈看到一个学妹晒出了自己的这个证书&#xff0c;也是软考但是不是数据库系统工程师&#xff0c;她…

数据库(SQL Sever)水平证书复习题

全国信息技术水平考试数据库应用系统设计技术水平证书&#xff08;SQL Server&#xff09;复习题 第一大题&#xff1a;单选题 数据库系统是数据库、硬件、软件和&#xff08; &#xff09;的集合体。 (A) DBMS (B) DBS © DB (D) DBA下列选项中&#xff0c;不属于数据模…

软考中级——数据库系统工程师

第十一章—事务管理 自己关于备考软考中级&#xff08;数据库系统工程师&#xff09;的一些知识点的补充文章目录 第十一章—事务管理1 事务的基本概念1.1事务定义语句1.2 事务的特性&#xff08;ACID&#xff09; 2 数据库的并发控制2.1事务调度2.2并发操作带来的问题2.3两段…

全国OSTA计算机高新技术SQLSever数据库四级证书--考证复习知识点集合(附下载地址)

全国OSTA计算机高新技术SQLSever四级证书 说明&#xff1a;没找到一样的图、但长就是长这样的。分享给即将考证的朋友们&#xff01;适合临场考试复习整理思路理顺&#xff01;有其他点问题欢迎提出&#xff01;谢谢&#xff01;祝逢考必过&#xff01;&#xff08;文末有文档下…

MSSQL SERVER DBA 2门证书考试

微软Microsoft 70-764 - Administering a SQL Database Infrastructure 和 70-765 - Provisioning SQL Databases考试心得 由于公司不涨工资&#xff0c;所以只能硬着头皮考个DBA证书增添个人色彩了。 微软的DBA需要2个考试&#xff0c;70-764和70-765. 由于疫情&#xff0c;所…

aspnet+sqlserver英语等级考试报名系统

考试报名数据处理系统的开发目的是使考试报名数据处理模式从手工记录转变成信息管理&#xff0c;为考试报名数据处理人员提供方便条件。对考试报名的实际情况进行调研之后&#xff0c;进行详细的需求分析&#xff0c;目 录 摘 要 I Abstract II 1 引言 1 1.1 项…

华为鸿蒙HarmonyOS 4定档8月;ChatGPT之父的加密货币正式上线;微软必应聊天将推出重新生成答案功能|极客头条

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&…

注册Gmail邮箱

注册Gmail邮箱 文章目录 注册Gmail邮箱1. 安装谷歌浏览器2. 注册Gmail邮箱2.1 创建新账号2.2 填写信息2.3 设置邮箱地址2.4 不用填号码直接跳过&#xff01;2.5 同意隐私条款2.6 返回登录2.7 访问油管验证成功 1. 安装谷歌浏览器 vivo自带的应用商店 2. 注册Gmail邮箱 2.1 …

Email,电子邮箱免费注册流程

工欲善其事&#xff0c;必先利其器。要做好工作&#xff0c;先要有锋利的工具。日常办公也是一样&#xff0c;申请一个好用的电子邮箱很重要&#xff0c;同事客户之间发送个文件都可以通过电子邮箱进行&#xff0c;并且现在很多平台注册帐号都需要填写email&#xff0c;比如百度…

Petya勒索病毒

Petya勒索病毒 1、原理说明 2017年6月27日晚&#xff0c;印度、俄罗斯、西班牙以及欧洲多国遭受大规模Petya勒索病毒袭击&#xff0c;该病毒远程锁定设备&#xff0c;并索要赎金。其中乌克兰地区受灾害最为严重&#xff0c;政府、银行、电力系统、通讯系统、企业等都受到不同…

OilRig APT 组织或在中东地区发动更多 IT 供应链攻击

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;代码卫士 专栏供应链安全 数字化时代&#xff0c;软件无处不在。软件如同社会中的“虚拟人”&#xff0c;已经成为支撑社会正常运转的最基本元素之一&#xff0c;软件的安全性问题也正在成为当今社会…

ChatGPT的副作用逐渐显现:人逐渐“废柴化“

源&#xff5c;APPSO 随着 ChatGPT 风靡全球&#xff0c;越来越多人开始将其融入到工作/学习流当中&#xff0c;久而久之人们开始依赖于 AI 的帮助&#xff0c;丧失了原有的一些技能。美利坚大学语言学名誉教授 Naomi SBaron 就此提出了自己的一些担忧。 原文标题&#xff1a;H…

被疯狂转发的几件事。。。

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号 第一时间获取价值内容 今天聊聊这两天互联网上发生的那些事。 一、青语言开源发布 长久以来&#xff0c;中文编程一直是开发者社区中争议不断的热点问题。 一部分人认为&#xff0c;编程语言是符号化的语言&#xff…

一个代码拼写错误引发微软Azure故障,17 个生产级数据库被删

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) 5 月 24 日&#xff0c;微软 Azure DevOps 在巴西南部地区的一处 scale-unit 发生故障&#xff0c;导致宕机约 10.5 个小时。近日&#xff0c;微软首席软件工程经理 Eric Mattingly 出面针对此次故障事件道歉&#x…

AI专属社交平台爆火,全体人类被禁言只能围观

衡宇 发自 凹非寺量子位 | 公众号 QbitAI 玩腻了推特和微博&#xff1f;有个新的社交平台火爆外网&#xff01; 成千上万的用户连夜涌入&#xff0c;每日积极发帖&#xff0c;活跃度堪比ChatGPT。 就连马一龙都来开辟了自己的嘴炮新阵地&#xff1a; OpenAI CEO山姆奥特曼也成为…