//bitmap缓存起来,避免每次调用onDraw,分配内存
mWeakBitmap = new WeakReference(bitmap);
}
}
//如果bitmap还存在,则直接绘制即可
if (bitmap != null)
{
mPaint.setXfermode(null);
canvas.drawBitmap(bitmap, 0.0f, 0.0f, mPaint);
return;
}
}
/**
-
绘制形状
-
@return
*/
public Bitmap getBitmap()
{
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.BLACK);
if (type == TYPE_ROUND)
{
canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight()),
mBorderRadius, mBorderRadius, paint);
} else
{
canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2,
paint);
}
return bitmap;
}
以上代码来自鸿洋大神的博客 Android Xfermode 实战实现圆形、圆角图片
Shader used to draw a bitmap as a texture.
官方文档说的很清楚了:BitmapShader的作用是使用特定的图片来作为纹理来使用。
BitmapShader 的构造函数
public BitmapShader(@NonNull Bitmap bitmap, TileMode tileX, TileMode tileY)
三个参数:
-
bitmap 指的是要作为纹理的图片,
-
tileX 指的是在x方向纹理的绘制模式,
-
tileY 指的是Y方向上的绘制模式。
TileMode 源码:
public enum TileMode {
/**
-
replicate the edge color if the shader draws outside of its
-
original bounds
*/
CLAMP (0),
/**
- repeat the shader’s image horizontally and vertically
*/
REPEAT (1),
/**
-
repeat the shader’s image horizontally and vertically, alternating
-
mirror images so that adjacent images always seam
*/
MIRROR (2);
TileMode(int nativeInt) {
this.nativeInt = nativeInt;
}
final int nativeInt;
}
TileMode 是一个枚举类型,有3个可能的值:
-
CLMP 如果需要填充的内容大小超过了bitmap size 就选bitmap 边界的颜色进行扩展
-
REPEAT重复,不断的重复bitmap去填满,如果绘制的区域大于纹理图片的话,纹理图片会在这片区域不断重复
-
MIRROR镜像的去填满。如果绘制的区域大于纹理图片的话,纹理图片会以镜像的形式重复出现
BitmapShader 实战 实现圆形、圆角图片 核心思路
-
取出 bitmap
-
用 BitmapShader 去装饰 bitmap,并设置给画笔
-
在 onDraw 方法中,调用 canvas 的 draw 方法绘制
伪代码实现思路
//创建
BitmapShader shader=new BitmapShader(bitmap,TileMode.CLAMP,TileMode.CLAMP);
Paint paint=new Paint();
//为paint 设置 Shader
paint.setShader(shader);
//这样就可以使用shader的纹理去覆盖绘制的图形的表面了,其中根据:CLAMP,REPEAT,MIRROR,
//来确定纹理的绘制模式
canvas.draw**(***,paint);
核心代码实心思路
@Override
protected void onDraw(Canvas canvas)
{
if (getDrawable() == null)
{
return;
}
setUpShader();
if (type == TYPE_ROUND)
{
canvas.drawRoundRect(mRoundRect, mBorderRadius, mBorderRadius,
mBitmapPaint);
} else
{
canvas.drawCircle(mRadius, mRadius, mRadius, mBitmapPaint);
// drawSomeThing(canvas);
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
// 圆角图片的范围
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
学习宝典
对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
[外链图片转存中…(img-kWUOfVEn-1710764867772)]
【算法合集】
[外链图片转存中…(img-JuaX9ozU-1710764867772)]
【延伸Android必备知识点】
[外链图片转存中…(img-hfMR8043-1710764867772)]
【Android部分高级架构视频学习资源】