效果如下:

<ignore_js_op>

device_thumb.png (68.26 KB, 下载次数: 41)

下载附件  保存到相册

2011-12-11 09:46 上传

 

主要代码如下:

  1. public static Bitmap createReflectedImage(Bitmap originalImage) {
  2. final int reflectionGap = 4;
  3. int width = originalImage.getWidth();
  4. int height = originalImage.getHeight();
  5. Matrix matrix = new Matrix();
  6. matrix.preScale(1, -1);
  7. Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
  8. height / 2, width, height / 2, matrix, false);
  9. Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
  10. (height + height / 2), Config.ARGB_8888);
  11. Canvas canvas = new Canvas(bitmapWithReflection);
  12. canvas.drawBitmap(originalImage, 0, 0, null);
  13. Paint defaultPaint = new Paint();
  14. canvas.drawRect(0, height, width, height + reflectionGap,
    defaultPaint);
  15. canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
  16. Paint paint = new Paint();
  17. LinearGradient shader = new LinearGradient(0,
  18. originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
  19. + reflectionGap, 0×70ffffff, 0×00ffffff,
  20. TileMode.MIRROR);
  21. paint.setShader(shader);
  22. paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
  23. canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
  24. + reflectionGap, paint);
  25. return bitmapWithReflection;
  26. }

复制代码

解释一下:

  1. Matrix matrix = new Matrix();
  2. matrix.preScale(1, -1);

复制代码

实现图片的反转,见Android利用Matrix简单处理图片

  1. Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
  2. height / 2, width, height / 2, matrix,
    false);

复制代码

创建反转后的图片Bitmap对象,图片高是原图的一半。

  1. Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
  2. (height + height / 2), Config.ARGB_8888);

复制代码

创建标准的Bitmap对象,宽和原图一致,高是原图的1.5倍。

  1. Canvas canvas = new Canvas(bitmapWithReflection);
  2. canvas.drawBitmap(originalImage, 0, 0, null);

复制代码

创建画布对象,将原图画于画布,起点是原点位置。

  1. Paint defaultPaint = new Paint();
  2. canvas.drawRect(0, height, width, height + reflectionGap,
    defaultPaint);
  3. canvas.drawBitmap(reflectionImage, 0, height + reflectionGap,
    null);

复制代码

将反转后的图片画到画布中。

  1. LinearGradient shader = new LinearGradient(0,
  2. originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
  3. + reflectionGap, 0×70ffffff, 0×00ffffff,

复制代码

创建线性渐变LinearGradient 对象。

  1. canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
  2. + reflectionGap, paint);

复制代码

画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果。

Android开发:轻松实现图片倒影效果的更多相关文章

  1. android 开发 解码gif图片,获取每帧bitmap

    环境:android 4.3  (注意对于android4.4版本解码出来不正确,除了第一帧正确外,其余的都是显示不同的地方)  通用版本见: android 开发对gif解码(适配android 4 ...

  2. android开发 socket接收图片并保存

    逻辑:接收到socket之后需要将socket发送的图片数据保存下来并通知handler更新界面 关键代码: public void readImage(Socket socket) { try { ...

  3. Android开发——内存优化 图片处理

    8.  用缓存避免内存泄漏 很常见的一个例子就是图片的三级缓存结构,分别为网络缓存,本地缓存以及内存缓存.在内存缓存逻辑类中,通常会定义这样的集合类. private HashMap<Strin ...

  4. Android开发之将图片文件转化为字节数组字符串,并对其进行Base64编码处理

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, 转载请说明出处. /** * @将图片文件转化为字节数组字符串,并对其进行Base64编码处理 * ...

  5. android开发之——获取相册图片和路径

    Android开发获取相册图片的方式网上有很多种,这里说一个Android4.4后的方法,因为版本越高,一些老的api就会被弃用,新的api和老的api不兼容,导致出现很多问题. 比如:managed ...

  6. android 开发 对图片编码,并生成gif图片

    demo场景: 将2张静态的png格式图片组合生成一个gif图片,间隔500毫秒,关键类:AnimatedGifEncoder 如需要解析gif获取每帧的图片,可参考上一篇博客:<android ...

  7. PHP接收android传过来的图片

    在android手机app上,上传图片,PHP服务端接收图片需要一下步骤 1 需要android 开发人员 把图片转成base64格式 2 PHP端接收转化后的base64字符串,然后进行转译 fun ...

  8. Android开发笔记——图片缓存、手势及OOM分析

    把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访 ...

  9. android开发 两张bitmap图片合成一张图片

    场景:对android4.4解码gif(解码文章见前面一篇)后的图片进行每帧处理,android4.3 解码出来的每帧都很完整,但是到android4.4版本就不完整了,每帧都是在第一帧的基础上把被改 ...

随机推荐

  1. MySQL对索引的使用

    什么是索引 使用索引可快速访问数据库表中的特定信息.索引是对数据库表中一列或多列的值进行排序的一种结构,例如 order 表的订单号(orderNum)列.如果要按订单号查找特定订单,与必须搜索表中的 ...

  2. SpringMVC in IDEA开发实践

    按照上篇装过Tomcat之后. 本机本来装了IDEA和Maven. 参考以下这篇 https://my.oschina.net/gaussik/blog/385697 <使用IntelliJ I ...

  3. C语言数字与字符串转换 atoi()函数、itoa()函数、sprintf()函数

    在编程中经常需要用到数字与字符串的转换,下面就总结一下. 1.atoi() C/C++标准库函数,用于字符串到整数的转换. 函数原型:int atoi (const char * str); #inc ...

  4. JavaScript中将html字符串转化为Jquery对象或者Dom对象

    实例代码: $('<a href="javascript:void(0);" onclick="showUI(this,"4028f65d5d1bb627 ...

  5. 【Qt】仿QQ表情选择控件

         表情选择控件在聊天应用中常常要用到,做起来尽管不复杂可是非常繁琐.特别是有些图标须要按顺序排列.每次重做必定是非常费时.所以我将聊天表情选择控件封装成一个独立的类QFaceSelectWid ...

  6. [置顶] Java中字符串为什么不以\0结尾

    其实这个问题没有什么好说的,Java里面一切都是对象,是对象的话,字符串肯定就有长度,即然有长度,编译器就可以确定要输出的字符个数,当然也就没有必要去浪费那1字节的空间用以标明字符串的结束了. 学过C ...

  7. Tomcat7出现HTTP Status 500 - java.lang.ClassCastException: org.apache.jasper.el.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl的解决

    今天在Tomcat7上发布了一个war,过一阵子发现localhost:8080都进不去了.在浏览器输入http://localhost:8080出现如下内容: HTTP Status 500 - j ...

  8. ab测试工具参数详解

    -n 测试会话中所执行的请求个数,默认仅执行一个请求 -c 一次产生的请求个数,即同一时间发出多少个请求,默认为一次一个 -t 测试所进行的最大秒数,默认为无时间限制....其内部隐含值是[-n 50 ...

  9. UVA 10090 Marbles(扩展欧几里得)

    Marbles Input: standard input Output: standard output I have some (say, n) marbles (small glass ball ...

  10. IP综合

    获取客户端IP的常用方法和注意事项: 进阶一:常用的方法,但是不够严谨. function getIP() { if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) ...