android 手把手教你绘制圆形头像

自从腾讯QQ中的圆形头像,火了起来后,现在我们在一些应用中都能看到圆形头像的身影,在个人主页或者个人资料面板中使用圆形头像,会使整个布局变得更加优雅

现在我们来进行第一步,创建一个继承ImageView的抽象类MakeRoundImage。让他重写onDraw方法,并且声明一个画笔


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
 * Created by blue on 2016/8/19.
 */

public class MakeRoundImage extends ImageView {
     private Paint paint;

    public MakeRoundImage(Context context) {
         this(context,null);
    }

    public MakeRoundImage(Context context, AttributeSet attrs) {
         this(context, attrs,0);
    }

    public MakeRoundImage(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        paint = new Paint();
    }

    @Override
    protected void onDraw(Canvas canvas) {

    }
}

然后就可以在onDraw 通过 getDrawable得到ImageView的drawable的属性,然后将它转换为bitmap,通过getRoundBitmap方法得到一个圆角的矩形的Bitmap,下面是getRoundRectBitmap方法

 /*
    @author :blue-zj
    获取到圆角矩形图片
     */
    private Bitmap getRoundRectBitmap(Bitmap bitmap) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int r = width > height ? height: width; //去圆角正方形的边长,取最短边做边长
        Bitmap backGround = Bitmap.createBitmap(width,
                height, Bitmap.Config.ARGB_8888); //创建一个与原图大小一样的32位ARGB位图
        Canvas canvas = new Canvas(backGround);   //new一个Canvas,在backgroundBmp上画图
        Paint paint = new Paint();
        paint.setAntiAlias(true); //设置画笔边缘光滑,去掉锯齿
        RectF rect = new RectF(0, 0, r, r); //设置宽高相等,(正方形)
        //通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,
        //且都等于r/2时,画出来的圆角矩形就是圆形
        canvas.drawRoundRect(rect, r >> 1, r >> 1, paint);
        //设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        //canvas将bitmap画在backgroundBmp上
        canvas.drawBitmap(bitmap, null, rect, paint);
        //返回已经绘画好的backgroundBmp
        return backGround;
    }

首先我们通过传进去的Bitmap,得到了原图的大小,创建了一个与原图一样大小的正方形圆角bitmap,然后我们在这个正方形圆角中将传进来的bitmap,与创建的位图通过画笔的

paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_IN));  //设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉

来讲bitmap进行裁剪成一个圆角矩形的bitmap,然后再返回,

最后在onDraw方法中调用getRoundRectBitmap获取到我们的圆角矩形图片,然后再在将原有的ImageView的canvas上进行裁剪

  @Override
    protected void onDraw(Canvas canvas) {  

        Drawable drawable = getDrawable();//得到ImageView的drawable属性
        if (null != drawable) {
            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();  //获取到ImageView的bitmap
            Bitmap b = toRoundBitmap(bitmap);//获取圆角图片
            /*
            Rect src: 是对图片进行裁截,若是空null则显示整个图片
             RectF dst:是图片在Canvas画布中显示的区域,
            大于src则把src的裁截区放大,
            小于src则把src的裁截区缩小。
             */
            final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());
            final Rect rectDest = new Rect(0,0,getWidth(),getHeight()   );
            paint.reset();  //重置画笔
            canvas.drawBitmap(b, rectSrc, rectDest, paint);//在原有的画布中裁剪出圆形图片
        } else {
            super.onDraw(canvas);
        }
    }   

这个图片裁剪的类已经写完了,最后就是在布局中调用了

<com.example.blue.makeroundimage.MakeRoundImage
    android:src="@drawable/my_head"
    android:layout_height="80dp"
    android:layout_width="80dp"

    tools:layout_editor_absoluteY="208dp"
    tools:layout_editor_absoluteX="157dp" />

下面是运行结果 :

最近越来越浮躁了,要时刻反省自己,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我也要保持自己的本色走下去。

时间: 2024-08-27 19:09:27

android 手把手教你绘制圆形头像的相关文章

Android 手把手教您自定义ViewGroup(一)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38339817 , 本文出自:[张鸿洋的博客] 最近由于工作的变动,导致的博客的更新计划有点被打乱,希望可以尽快脉动回来~ 今天给大家带来一篇自定义ViewGroup的教程,说白了,就是教大家如何自定义ViewGroup,如果你对自定义ViewGroup还不是很了解,或者正想学习如何自定义,那么你可以好好看看这篇博客. 1.概述 在写代码之前,我必须得问几个问题: 1.ViewG

android自定义View绘制圆形头像与椭圆头像

要实现这两种效果,需要自定义View,并且有两种实现方式. 第一种: public class BitmapShaders extends View { private  BitmapShader bitmapShader = null; private Bitmap bitmap = null; private Paint paint = null; private ShapeDrawable shapeDrawable = null; private int BitmapWidth  = 0

【Android开源项目分析】自定义圆形头像CircleImageView的使用和源码分析

本文分为三大部分: CircleImageView的使用 CircleImageView源码分析 Android自定义View总结 CircleImageView项目源码下载: https://github.com/hdodenhof/CircleImageView 打开源码会发现主要就是一个继承了ImageView 的类--CircleImageView .java,代码优雅精致,效果很nice.下面会进行源码分析,让我加深了不少Canvas.BitmapShader.Matrix相关知识.

android 手把手教你照片墙应用实现,再多的图片也不怕OOM

今天讲一个照片墙的应用,这个在去年还算是比较流行的,现在不忙,也准备简单的实现以下,之所以说是照片墙是好像图片加载出来后贴上去的感觉,这个用GridView控件,然后加载出来的图片放上去即可! 实现原理: 1:去重复 相同的url不要下载二次,可以用set集合对封装的任务,但是我们应用使用了内存缓存即使不做判断也不会加载二次,因为LruCache对象已经帮我们实现了 2:下载图片的任务使用了AsyncTask 3:当我们快速滑动屏幕的时候 怎么做到当手指松开的时候才加载可见屏幕范围对应的图片 避

android 手把手教你10分钟快速接个推推送服务

在现在的一款app中,如果没有推送功能,就好像做项目中没用到listview,你出去面试都不好意思说自己是做android开发的, 但是推送自己写嘛,我可以说70~80%公司都是使用第三方的,因为这块不好做,对技术要求也高,所以学习,做起来花费时间也多,综合起来所以一般都用第三方的,目前市场上推送第三方有个推,激光,百度推送,腾讯的信鸽,友推,相比起来,目前我所知道的好多都是使用个推,而且目前公司项目也是使用个推,今天就接入了个推,所以写个博客,把自己遇到的问题记录下,也方便后人观看, 使用第三

android手把手教你开发launcher(一)

auncher,也就是android的桌面应用程序.下图是android2.3的launcher应用程序: 接下来我们要开发一个自己的launcher,使其替代系统的默认launcher. 怎样使我们的应用程序成为一个launcher? 下面我们就新建一个叫做SAOLauncher的工程,具体步骤略.创建完工程后整个目录结构如下图: 现在我们的AndroidManifest.xml文件这样的: <span style="font-family: 'Comic Sans MS';"

手把手教你绘制网页验证码

验证码 本文的中的验证码使用Java的awt进行绘制,样式如下图所示 接下来开始进行绘制. (1)创建一个Web项目,项目的目录结构如下 (2)创建Servlet类,继承HttpServlet,重写doGet和doPost方法 PicCodeServlet.java package com.ghq.controller; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.i

android分析之自定义圆形头像

package de.hdodenhof.circleimageview; public class CircleImageView extends ImageView { private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;//决定了图片在View上显示时的样子,如进行何种比例的缩放,及显示图片的整体还是部分,等等 private static final Bitmap.Config BITMAP_CONFIG =

【Android】自定义圆形ImageView(圆形头像 可指定大小)

最近在仿手Q的UI,这里面经常要用到的就是圆形头像,看到 在android中画圆形图片的几种办法 这篇文章,了解了制作这种头像的原理.不过里面提供的方法还有一个不足的地方就是不能根据实际需求改变图片的大小,也就是说提供的原图是大尺寸的,转换之后的图片也是大尺寸的,这显然不符合我们实际项目中的需求.于是我对里面介绍的第一种方法做了一番改进,使其能直接在XML中指定图片的大小. 大体步骤 将原图居中裁剪成正方形 根据指定的宽度对正方形进行缩放 裁剪成圆形 效果 代码实现 package com.de