Android使用2D方法实现倒影特效(像素操作)
每一个图像像素通过一个4字节整数来展现。最高位字节用作alpha通道;换言之用来实现透明/不透明控制。255代表完全不透明;0则代表完全透明。接下来一个字节是red红色通道;255代表完全是红色。依次类推接下来两个字节相应的实现绿色和蓝色通道。
现在你可以对单独的像素进行处理了。通过使用android.graphics.Bitmap API中的getPixels,可以加载像素到一个整数数组中。在本文例子中,你将按照一定规则对每一个像素实现着色。经过这个处理后,所有的像素将被转化为一个范围在0到255的字节码。android.graphics.Bitmap API中的setPixels则用来加载这个整数数组到一个图像中。最后一步是通过ImageView变量mIV来更新屏幕。以下是实现这个染色过程的代码片段。
private void TintThePicture(int deg) {
int[] pix = new int[picw * pich];
mBitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
int RY, GY, BY, RYY, GYY, BYY, R, G, B, Y;
double angle = (3.14159d * (double)deg) / 180.0d;
int S = (int)(256.0d * Math.sin(angle));
int C = (int)(256.0d * Math.cos(angle));
for (int y = 0; y < pich; y++)
for (int x = 0; x < picw; x++)
{
int index = y * picw + x;
int r = (pix[index] >> 16) & 0xff;
int g = (pix[index] >> 8) & 0xff;
int b = pix[index] & 0xff;
RY = ( 70 * r – 59 * g – 11 * b) / 100;
GY = (-30 * r + 41 * g – 11 * b) / 100;
BY = (-30 * r – 59 * g + 89 * b) / 100;
Y = ( 30 * r + 59 * g + 11 * b) / 100;
RYY = (S * BY + C * RY) / 256;
BYY = (C * BY – S * RY) / 256;
GYY = (-51 * RYY – 19 * BYY) / 100;
R = Y + RYY;
R = (R < 0) ? 0 : ((R > 255) ? 255 : R);
G = Y + GYY;
G = (G < 0) ? 0 : ((G > 255) ? 255 : G);
B = Y + BYY;
B = (B < 0) ? 0 : ((B > 255) ? 255 : B);
pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
}
Bitmap bm = Bitmap.createBitmap(picw, pich, false);
bm.setPixels(pix, 0, picw, 0, 0, picw, pich);
// Put the updated bitmap into the main view
mIV.setImageBitmap(bm);
mIV.invalidate();
mBitmap = bm;
pix = null;
}
使用 2D 方法实现倒影特效
倒影可以为 UI 界面带来立体感,是一个常用的 UI 特效。下图是一个图片浏览 程序的 GridView,该 View 的倒影特效为 UI 界面增色不少。
实现原理
实现倒影可以使用 OpenGL 等 3D 接口方法,也可以用 2D 的方法模拟。
用 2D 方法实现倒影需要从两个方面考虑:
倒影是上、下翻转的图像;
从上到下透明度越来越大。
图像翻转的实现
原理上讲,图像的翻转实际就是将图像数据上下行互换。
Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
for (int y = 0; y < h; y++){
bm.setPixels(srcPix, y * w, w, 0, h - y - 1, w, 1);
}
透明度渐变
实现透明度渐变有两种方法,一是使用蒙板;二是直接修改像素数据,修改每个 像素的 alpha 值。
对于蒙板法,事先做好一张透明度渐变的图,这就是我们的蒙板,在绘制完图像 之后把蒙板图片绘制上去,这样就产生了透明度渐变的效果。
对于第二种方法,我们需要首先读出图片的数据,然后修改每个像素的 alpha 值。下面的代码片段的功能是逐行增加 alpha 值,产生的效果是自上向下由暗 变亮。
int alpha = 0x00000000;
mBitmap.getPixels (pix, 0, w, 0, 0, w, h);
for (int y = 0; y<h; y++) {
for (int x=0; x<w; x++) {
int index = y * w + x;
int r = (pix[index] >> 16) & 0xff;
int g = (pix[index] >> 8) & 0xff;
int b = pix[index] & 0xff;
pix[index] = alpha | (r<<16) | (g<<8) | b;
}
alpha = alpha + 0x01000000;
}
文章导读
游戏推荐
- 热门
- 最新
会说话的狗狗本 Talking Be 会说话的狗狗本是会说话系列中的一款,知名度应该是仅次于会...
查看详情
弗拉特潜水 Flutty Diver vFlutty Diver(弗拉特潜水)是一款非常可爱的益智游戏,这是安卓...
查看详情
太空披萨 Space Pizza DeliSpace Pizza Delivery(太空披萨)是一款较为简单的跳跃类的小...
查看详情
人类:历史 Person: The HisPerson: The History(人类:历史)是一款画面非常单调的游戏,灰...
查看详情
会说话的狗狗本 Talking Be 会说话的狗狗本是会说话系列中的一款,知名度应该是仅次于会...
查看详情
弗拉特潜水 Flutty Diver vFlutty Diver(弗拉特潜水)是一款非常可爱的益智游戏,这是安卓...
查看详情
太空披萨 Space Pizza DeliSpace Pizza Delivery(太空披萨)是一款较为简单的跳跃类的小...
查看详情
人类:历史 Person: The HisPerson: The History(人类:历史)是一款画面非常单调的游戏,灰...
查看详情
软件推荐
- 热门
- 最新
海豚浏览器 v8.0今天,国产手机浏览器知名品牌海豚浏览器发布了它的一个最新...
查看详情
应用魔方 AppShare v2.4.3AppShare(应用魔方)是一款比较具有人气的安卓手机应用,它能够...
查看详情
超频软件 Voltage Control Voltage Control Extreme是安卓平台一款非常受欢迎的CPU超...
查看详情
音频管理器 AudioManager P音频管理器 (AudioManager Pro)的功能不错,能够方便你控制安卓...
查看详情
土司 v1.0土司是一款在线交流与分享软件,能够让你DIY自己的手机社区,你...
查看详情
海豚浏览器 v8.0今天,国产手机浏览器知名品牌海豚浏览器发布了它的一个最新...
查看详情
迈播 v2.0.1.0215迈播是由迈视网(www.maxtv.cn)开发的一款免费的手机视频应用,...
查看详情
应用魔方 AppShare v2.4.3AppShare(应用魔方)是一款比较具有人气的安卓手机应用,它能够...
查看详情
推荐文章
- 新闻
- 评测
- 教程

