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 实现圆形头像的主要内容,如果未能解决你的问题,请参考以下文章