Android绘制圆形图片的方法

本是古典 何须时尚 2022-06-01 10:56 573阅读 0赞

1.使用Xfermode 相交模式

见:http://blog.csdn.net/zcn596785154/article/details/79180145

2.通过裁剪画布区域实现

Canvas类提供了ClipPath, ClipRect, ClipRegion 等方法来裁剪画布,通过他们的不同组合,可以得到任意形状的画布,然后在这个区域上画图,就可以获得对应形状的View了。但是,使用裁剪画布的方式实现圆形头像会有锯齿,边缘不如其他方式平滑。代码如下:

  1. //为了保证绘制出来的View为圆形,如果图片的长宽不一致,长的部分会被截断
  2. @Override
  3. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  4. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  5. int mSize = Math.min(getMeasuredWidth(), getMeasuredHeight());
  6. mRadius = mSize / 2;
  7. setMeasuredDimension(mSize, mSize);
  8. }
  9. @Override
  10. protected void onDraw(Canvas canvas) {
  11. mPath.addCircle(mRadius, mRadius, mRadius, Path.Direction.CW);
  12. canvas.clipPath(mPath);
  13. super.onDraw(canvas);
  14. }

3.使用BitmapShader

Shader就是画笔Paint的渲染器,本质上这种方法其实是画圆,只是渲染时采用了我们设置的图片。

BitmapShader是Shader的子类,可以通过Paint.setShader(Shader shader)进行设置,然后用这个Paint绘图时,就会根据你设置的TileMode,对绘制区域进行着色。BitmapShader的构造方法:
mBitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);

参数TileMode的取值有三种:
- CLAMP 拉伸:拉伸的是图片最后的那一个像素
- REPEAT 重复:就是横向、纵向不断重复这个bitmap
- MIRROR 镜像:横向、纵向不断翻转重复

代码示例如下:

  1. @Override
  2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  3. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  4. mSize = Math.min(getMeasuredWidth(), getMeasuredHeight());
  5. mRadius = mSize / 2;
  6. setMeasuredDimension(mSize, mSize);
  7. }
  8. @Override
  9. protected void onDraw(Canvas canvas) {
  10. //得到原bitmap
  11. Bitmap src = ((BitmapDrawable) getDrawable()).getBitmap();
  12. if (src == null) {
  13. super.onDraw(canvas);
  14. return;
  15. }
  16. //把bitmap缩小为和View大小一致
  17. Bitmap newBitmp = Bitmap.createScaledBitmap(src, mSize, mSize, false);
  18. if (newBitmp == null) {
  19. return;
  20. }
  21. //将缩小后的bitmap设置为画笔的shader
  22. mBitmapShader = new BitmapShader(newBitmp, Shader.TileMode.REPEAT,
  23. Shader.TileMode.REPEAT);
  24. //生成用来绘图的bitmap,并在其上用画笔绘图
  25. Bitmap dest = Bitmap.createBitmap(mSize, mSize, Bitmap.Config.ARGB_8888);
  26. if (dest == null) {
  27. return;
  28. }
  29. Canvas c = new Canvas(dest);
  30. Paint paint = new Paint();
  31. paint.setAntiAlias(true);
  32. paint.setShader(mBitmapShader);
  33. c.drawCircle(mRadius, mRadius, mRadius, paint);
  34. //将最后生成的bitmap绘制到View的canvas上
  35. canvas.drawBitmap(dest, 0, 0, paint);
  36. }

发表评论

表情:
评论列表 (有 0 条评论,573人围观)

还没有评论,来说两句吧...

相关阅读