android 马赛克 代码,Android_Android 马赛克(Mosaics)效果,前几天看见开源项目效果好赞 - phpStudy...

Android 马赛克(Mosaics)效果

前几天看见开源项目效果好赞,看了下代码,实现大致就是在原界面之上覆盖一成自定义的View,获取到点击的那个View的内容(Bitmap),然后在覆盖的那个自定义View的特定位置画出来,之后就是对这个Bitmap做一些列拆分,变化重绘的过程。在这里根据他对bitmap的拆分,感觉用来实现Bitmap的效果也是不错的,就试着做一做。

在这里介绍使用两种方式实现马赛克效果.开始之前先看看效果

感觉还不错吧!

1、直接绘制

public static Bitmap getMosaicsBitmap(Bitmap bmp, double precent) {

long start = System.currentTimeMillis();

int bmpW = bmp.getWidth();

int bmpH = bmp.getHeight();

Bitmap resultBmp = Bitmap.createBitmap(bmpW, bmpH, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(resultBmp);

Paint paint = new Paint();

double unit;

if (precent == 0) {

unit = bmpW;

} else {

unit = 1 / precent;

}

double resultBmpW = bmpW / unit;

double resultBmpH = bmpH / unit;

for (int i = 0; i < resultBmpH; i++) {

for (int j = 0; j < resultBmpW; j++) {

int pickPointX = (int) (unit * (j + 0.5));

int pickPointY = (int) (unit * (i + 0.5));

int color;

if (pickPointX >= bmpW || pickPointY >= bmpH) {

color = bmp.getPixel(bmpW / 2, bmpH / 2);

} else {

color = bmp.getPixel(pickPointX, pickPointY);

}

paint.setColor(color);

canvas.drawRect((int) (unit * j), (int) (unit * i), (int) (unit * (j + 1)), (int) (unit * (i + 1)), paint);

}

}

canvas.setBitmap(null);

long end = System.currentTimeMillis();

Log.v(TAG, "DrawTime:" + (end - start));

return resultBmp;

}

2、修改像素点

public static Bitmap getMosaicsBitmaps(Bitmap bmp, double precent) {

long start = System.currentTimeMillis();

int bmpW = bmp.getWidth();

int bmpH = bmp.getHeight();

int[] pixels = new int[bmpH * bmpW];

bmp.getPixels(pixels, 0, bmpW, 0, 0, bmpW, bmpH);

int raw = (int) (bmpW * precent);

int unit;

if (raw == 0) {

unit = bmpW;

} else {

unit = bmpW / raw; //原来的unit*unit像素点合成一个,使用原左上角的值

}

if (unit >= bmpW || unit >= bmpH) {

return getMosaicsBitmap(bmp, precent);

}

for (int i = 0; i < bmpH; ) {

for (int j = 0; j < bmpW; ) {

int leftTopPoint = i * bmpW + j;

for (int k = 0; k < unit; k++) {

for (int m = 0; m < unit; m++) {

int point = (i + k) * bmpW + (j + m);

if (point < pixels.length) {

pixels[point] = pixels[leftTopPoint];

}

}

}

j += unit;

}

i += unit;

}

long end = System.currentTimeMillis();

Log.v(TAG, "DrawTime:" + (end - start));

return Bitmap.createBitmap(pixels, bmpW, bmpH, Bitmap.Config.ARGB_8888);

}

从效率上来看,第二中方式效率会高10倍,只要是因为第一种方式绘制的次数太多了,而绘制是比较费时间的。这里特别提示,不要在大量的循环语句内部使用Log.v(...),这是一个很耗时间的操作。

是不是很有趣,大家可以亲自动手试验一下。相关阅读:

HTML5+CSS3绘制锯齿状的矩形

JAVA基础之控制台输入输出的实例代码

mysql的udf编程之非阻塞超时重传

纯css实现三角的简单实例

PHP中的Trait 特性及作用

Win10设置IE浏览器禁止网站弹出窗口的方法

jQuery遍历之next()、nextAll()方法使用实例

Java并发编程之栅栏(CyclicBarrier)实例介绍

详解WordPress中过滤链接与过滤SQL语句的方法

php的文件上传入门教程(实例讲解)

Linux系统下jailkit的安装与使用示例

asp.net控件DataList分页用法

WinXP/Vista/7/8/怎么免费升级Win10?必需这样

详解Java编程中if...else语句的嵌套写法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值