Android仿QQ圆形头像
16lz
2021-01-23
先上效果图:
实现思路:
自定义一个View,继承ImageView,通过PorterDuffXfermode实现一个Mask效果,并在onDraw中画出来。
自定义View的代码:
public class CircleClipView extends ImageView{ private Paint backgroundPaint = null; private Paint maskPaint = null; private int backgroundColor = -1; public CircleClipView(Context context) {// TODO Auto-generated constructor stubsuper(context);init();}public CircleClipView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubTypedArray a = context.obtainStyledAttributes(attrs,R.styleable.circleview);backgroundColor = a.getColor(R.styleable.circleview_backgroundcolor, Color.WHITE);a.recycle();init();}private void init(){maskPaint = new Paint();PorterDuffXfermode porterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);maskPaint.setXfermode(porterDuffXfermode);maskPaint.setColor(Color.TRANSPARENT);maskPaint.setAntiAlias(true);backgroundPaint = new Paint();backgroundPaint.setColor(backgroundColor);backgroundPaint.setAntiAlias(true); }private Bitmap getMask(){Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(b);RectF rectF = new RectF(0, 0, getWidth(), getHeight());canvas.drawRect(rectF, backgroundPaint);canvas.drawOval(rectF, maskPaint);return b;}private Bitmap scaleDrawable(Drawable drawable){Bitmap b = ((BitmapDrawable) drawable).getBitmap();Matrix matrix = new Matrix();float scaleWidth = ((float) getWidth()) / b.getWidth(); float scaleHeight = ((float) getHeight()) / b.getHeight(); matrix.postScale(scaleWidth, scaleHeight);Bitmap bitmap = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(),matrix, true);return bitmap;}@Overrideprotected void onDraw(Canvas canvas){Bitmap sourceBitmap = scaleDrawable(getDrawable());if(sourceBitmap != null) canvas.drawBitmap(sourceBitmap, 0, 0, null);canvas.drawBitmap(getMask(), 0, 0, null);}}
XML代码
<?xml version="1.0" encoding="utf-8"?>
更多相关文章
- 工具:Android本地代码生成器
- Android很有用的代码片段
- android上传图片到服务器,求服务器那边和android的Activity的完整
- android 源代码研究之----frameworks-----status bar 状态栏
- Android 代码实现重启
- 【Arcgis android】 离线编辑实现及一些代码段
- Android 实现扫雷小游戏实例代码
- android代码分析,及Terminal使用
- Android应用程序绑定服务(bindService)的过程源代码分析(2)