android 实现圆形头像

Posted 踏雪羽翼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 实现圆形头像相关的知识,希望对你有一定的参考价值。

1、首先看一下实现效果


2、首先新建一个自定义view实现ImageView,详细可看注释

package com.example.a550211.xfermode;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;

/**
 * Created by 550211 on 2017/9/23.
 */

public class MyImageView extends ImageView 

    private Paint mPaint;//设置画笔
    private Bitmap mBitmap;//获取图片资源
    private int width, height;//获取控件宽高
    private int mOuterRing = 0;//设置外圈大小
    private int outerRingAlpha = 30;//设置外圈透明度
    private int color = Color.BLUE;//设置外圈颜色

    public MyImageView(Context context) 
        this(context, null);
    

    public MyImageView(Context context, AttributeSet attrs) 
        this(context, attrs, 0);
    

    public MyImageView(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
        mPaint = new Paint();
    

    public Bitmap getBitmap() 
        return mBitmap;
    

    public void setBitmap(Bitmap bitmap) 
        this.mBitmap = bitmap;
    

    public int getmOuterRing() 
        return mOuterRing;
    

    public void setmOuterRing(int mOuterRing) 
        this.mOuterRing = mOuterRing;
    

    public int getColor() 
        return color;
    

    public void setColor(int color) 
        this.color = color;
    

    public int getOuterRingAlpha() 
        return outerRingAlpha;
    

    public void setOuterRingAlpha(int outerRingAlpha) 
        this.outerRingAlpha = outerRingAlpha;
    

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //获取空间宽高
        width = View.getDefaultSize(getMeasuredWidth(), widthMeasureSpec);
        height = View.getDefaultSize(getMeasuredHeight(), heightMeasureSpec);
    

    @Override
    protected void onDraw(Canvas canvas) 

        Drawable drawable = getDrawable();
        Bitmap bitmap;
        if (drawable != null) 
            if (mBitmap != null) 
                bitmap = mBitmap;
             else 
                bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
            
            Matrix matrix = new Matrix();
            //设置图片缩放比例,
            if (mOuterRing>0)
                if (width > height) 
                    matrix.setScale((float) (height) / bitmap.getHeight(), (float) (height) / bitmap.getHeight());
                 else 
                    matrix.setScale((float) (width) / bitmap.getWidth(), (float) (width) / bitmap.getWidth());
                
            else 
                if (width > height) 
                    matrix.setScale((float) (width) / bitmap.getWidth(), (float) (width) / bitmap.getWidth());
                 else 
                    matrix.setScale((float) (height) / bitmap.getHeight(), (float) (height) / bitmap.getHeight());
                
            

            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            //将图片设置为圆形
            bitmap = toRoundBitmap(bitmap);

            //当外圈大于0的时候要设置外圈加图片的宽度不能大于控件宽度
            if (mOuterRing+bitmap.getWidth()>width)
                mOuterRing = (width-bitmap.getWidth())/2;
            

            //绘制外圈
            Paint cPaint = new Paint();
            cPaint.setStrokeWidth(2);
            cPaint.setColor(color);
            cPaint.setAlpha(outerRingAlpha);
           // cPaint.setFilterBitmap(true);
            cPaint.setAntiAlias(true);
            canvas.drawCircle(bitmap.getWidth()/2+mOuterRing,bitmap.getHeight()/2+mOuterRing,bitmap.getWidth()/2+mOuterRing,cPaint);

            //绘制图片
            canvas.drawBitmap(bitmap, mOuterRing, mOuterRing, mPaint);

         else 
            super.onDraw(canvas);
        
    

    /**
     * 设置图片为圆形
     *
     * @param bitmap
     * @return
     */
    public Bitmap toRoundBitmap(Bitmap bitmap) 
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float roundPx;
        float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
        if (width <= height) 
            roundPx = width / 2;
            top = 0;
            bottom = width;
            left = 0;
            right = width;
            height = width;
            dst_left = 0;
            dst_top = 0;
            dst_right = width;
            dst_bottom = width;
         else 
            roundPx = height / 2;
            float clip = (width - height) / 2;
            left = clip;
            right = width - clip;
            top = 0;
            bottom = height;
            width = height;
            dst_left = 0;
            dst_top = 0;
            dst_right = height;
            dst_bottom = height;
        

        Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom);
        final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom);
        final RectF rectF = new RectF(dst_left, dst_top, dst_right, dst_bottom);

        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, src, dst, paint);
        return output;
    


2、在布局中使用
 <com.example.a550211.xfermode.MyImageView
        android:id="@+id/MyImageView"
        android:src="@mipmap/ic_launcher"
        android:scaleType="centerCrop"
        android:layout_width="100dp"
        android:layout_height="100dp" />
3、代码中使用

package com.example.a550211.xfermode;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity 
    private MyImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    

    private void initView() 
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
        imageView = (MyImageView) findViewById(R.id.MyImageView);
        imageView.setBitmap(bitmap);
        imageView.setmOuterRing(56);
        imageView.setColor(Color.RED);
        imageView.setOuterRingAlpha(50);
    
这样就可以简单实现圆形头像了





以上是关于android 实现圆形头像的主要内容,如果未能解决你的问题,请参考以下文章

android 实现圆形头像

android 怎么利用shape实现圆形用户头像

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

登录圆形头像之网络加载与缓存到本地

android-圆形头像

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