skia android 教程,Android下Skia遮罩特效的实现
大体需求是,有一个文字点阵,叫glyph,为单色点阵,有笔画的地方为黑色,1;无笔画的地方为白色,0;
现在要把这个字画到屏幕,还有一个要求,要用当前颜色画;
分析来分析去,这就是一个简单的rop3操作,或者简单一点,就是一个遮罩特效:使用glyph当遮罩,使用当前颜色画矩形,仅此而以。
但是,目前没有在Skia中找到类似的操作,只找到SkXformode里有这样的定义:
enum Mode {
kClear_Mode, //!< [0, 0]
kSrc_Mode, //!< [Sa, Sc]
kDst_Mode, //!< [Da, Dc]
kSrcOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Sc + (1 -
Sa)*Dc]
kDstOver_Mode, //!< [Sa + Da - Sa*Da, Rc = Dc + (1 -
Da)*Sc]
kSrcIn_Mode, //!< [Sa * Da, Sc * Da]
kDstIn_Mode, //!< [Sa * Da, Sa * Dc]
kSrcOut_Mode, //!< [Sa * (1 - Da), Sc * (1 - Da)]
kDstOut_Mode, //!< [Da * (1 - Sa), Dc * (1 - Sa)]
kSrcATop_Mode, //!< [Da, Sc * Da + (1 - Sa) * Dc]
kDstATop_Mode, //!< [Sa, Sa * Dc + Sc * (1 - Da)]
kXor_Mode, //!< [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1-Sa)* Dc]
......
基本上看不懂,光看公式,没法知道到底是个什么效果;看来只有使用这些东西来模拟遮罩效果了。
试验来试验去,下面的代码可以实现:
1 首先,把单色位图转换成32位
static void depth1to32(const uint16 * data, uint8 * out,
uint8
*
end)
{
uint16 pixel;
uint32 value;
......
// glyph : src SkBitmap
// bitmap : dst SkBitmap
int width;
int height;
width = glyph->width();
height = glyph->height();
uint8 *sbits;
sbits = (uint8 *)data;
int sstride;
sstride = (width + 7) / 8;
uint8 *sline;
sline = sbits;
// check format
uint8 *dbits;
dbits = (uint8 *)out;
int dstride;
dstride = bitmap->rowBytes();
int dbpp; // bytes per pixel
dbpp = bitmap->bytesPerPixel();
uint8 *dline;
dline = dbits;
while (height--)
{
int w = width;
uint8 *dline1 = dline;
uint8 *sline1 = sline;
while(w > 0)
{
uint8 pixel8;
pixel8 = *(sline1++);
for(int i = 0; i < (w < 8 ? w : 8); i++)
{
uint8 c = 1 < < (7 - i);
if(pixel8 & c)
{
*(dline1++) = 0;
*(dline1++) = 0;
*(dline1++) = 0;
// 这个地方,如果最高两个字节是0,则表示透明
*(dline1++) = 0xFF;
}
else
{
*(dline1++) = 0xff;
*(dline1++) = 0xff;
*(dline1++) = 0xff;
// 这个地方,如果最高两个字节是0,则表示透明
*(dline1++) = 0;
}
}
w -= 8;
}
dline += dstride;
sline += sstride;
}
}
......
2 使用当前颜色转换遮罩
SkBitmap *srcbmp = (SkBitmap*)(bitmap);
SkPaint paint;
SkCanvas canvas(*srcbmp);
paint.setXfermodeMode(SkXfermode::kSrcIn_Mode);
paint.setColor(display->foreColor);
SkRect rect = { 0, 0, srcbmp->width(),
srcbmp->height()};
canvas.drawRect(rect, paint);
自此,srcbmp已经变成了当前颜色表示的字符点阵
3 把字符画到屏幕
SkShader* s = SkShader::CreateBitmapShader(*srcbmp,
SkShader::kClamp_TileMode,
SkShader::kClamp_TileMode);
SkMatrix matrix;
matrix.reset();
matrix.postTranslate(x, y);
SkShader *shader = (SkShader *)s;
shader->setLocalMatrix(matrix); // 设置原点
SkPaint *paint = (SkPaint *)paint;
paint->setShader(shader)->unref();
paint->setXfermodeMode(SkXfermode::kSrcOver_Mode);
paint->setColor(display->foreColor);
SkRect rect = { x, y, x + w, y + h};
canvas->drawRect(rect, *paint);
这段代码,相当于把一个部分区域透明的pattern画到屏幕上
这样,我们就实现了字符遮罩的功能,使用当前颜色把字符画到屏幕上了。
当然,我们只是画了一个单色字符,其实也可以画很复杂的图案,类似于PS和Flash里的遮罩层的效果。
以上代码是示意代码,因此有些地方明显无法编译,有些地方明显多此一举,请注意。
另,Skia有类似Mask的概念,但看来看去,好像没有我们这里说的遮罩功能。
如果大家有更好的实现方法,也请告诉我一下。
skia android 教程,Android下Skia遮罩特效的实现相关推荐
- Xamarin Android教程Android基本知识版本介绍与系统介绍
Xamarin Android教程Android基本知识版本介绍与系统介绍 Xamarin Android教程Android基本知识版本介绍与系统介绍,开发Andriod有时候不像iOS一样轻松,因为 ...
- android教程 - android ui 介绍,多图详解 “Android UI”设计官方教程
我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...
- flex+android+教程,android开发flex4.5入门教程.pdf
android开发flex4.5入门教程 中国矿业大学教务部 教务通知(2013 )第33 号 关于做好各级"大学生创新训练计划" 项目中期检查和结题验收的通知 各学院: 为加强我 ...
- monkey android 教程,Android Monkey使用详解
Monkey 是Android SDK提供的一个命令行工具,是一个黑盒压力测试工具,采用随机算法,对被测应用随机发送伪随机的用户事件流,如点击,拖拽,滑动,输入等,来确定应用是否会发生异常,并且会产生 ...
- 2020最新android教程,Android教程2020
本文介绍RecyclerView设置点击的方法.这里给出比较常见的使用方式. 用户点击某个item时,app可以做出相应的反应.这里我们使用添加点击监听器的方式来实现这个效果. Android开发中, ...
- orbot android教程,Android Orbot malformed reply from SOCKS server
问题 I am trying to enable TOR support on my own XMPP app in android. I am using orbot as TOR proxy an ...
- android对skia的封装,Skia引擎API整理介绍(skia in Android 2.3 trunk)
序 通过google, baidu,我们都很难搜索到关于skia引擎方面的文档,skia的官方wiki(http://code.google.com/p/skia) 也只有寥寥无几的文字简单介绍了Sk ...
- android studio最新教程pdf下载,android studio教程pdf下
android studio教程pdf下 [2021-02-13 15:00:57] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace( ...
- android渲染是skia与egl,opengl和skia哪个快 游戏电脑问题解决分享!
从Honeycomb[3.x]版本起,Andorid便支持GPU加速,但目前Android并没有使用Skia GPU进行Webkit渲染.Skia GPU使用OpenGL进行后台加速渲染,未来也许会代 ...
最新文章
- ValueError: Bin labels must be one fewer than the number of bin edges
- yolov5检测完不显示框和标注
- [My B.S paper draft]我的本科答辩论文草稿
- html使用共同的头部导航
- (58)模拟线程切换——添加挂起、恢复线程功能
- Sequence II (HDU 5919)(主席树)
- 动态规划 —— 背包问题 P09 —— 背包问题的变化
- eclipse中在线安装gradle插件
- java 冗余,java代码冗余
- Linux 邮件服务器 之跟我一步一步来实现一个邮件系统
- sprintf参数包含本身时,结果并不符合预期
- 使用WMI和性能计数器监控远程服务器权限设置
- Informix ODBC 设置
- WINCC 7.4 SP1 7.5 博图v16 硬件学习补丁
- 【校招VIP】产品行测之逻辑推理
- 2022-车道线检测综述
- Lambda表达式----“进化论”
- 只要简单7步就能破解魔方的图文教程!怎样还原魔方?
- MySQL varchar类型可以存储多少个汉字
- 人工智能之知识图谱体系总结