ReflectionImage是从android.widget.ImageView继承而来,使用方法和其他的Android控件一样

实现思路是从某个网站上剽窃过来的。

实现起来很简单,详细的解释写到注释里面,总体思路就是在Canvas里面重新把原始图片画一次,反转图片用Matrix来做,透明处理实际上是加了一层渐变的蒙板.

源码如下:

Java代码  
  1. import android.content.Context;
  2. import android.graphics.Bitmap;
  3. import android.graphics.BitmapFactory;
  4. import android.graphics.Canvas;
  5. import android.graphics.LinearGradient;
  6. import android.graphics.Matrix;
  7. import android.graphics.Paint;
  8. import android.graphics.PorterDuffXfermode;
  9. import android.graphics.Bitmap.Config;
  10. import android.graphics.PorterDuff.Mode;
  11. import android.graphics.Shader.TileMode;
  12. import android.graphics.drawable.BitmapDrawable;
  13. import android.util.AttributeSet;
  14. import android.widget.ImageView;
  15. public class ReflectionImage extends ImageView {
  16. //是否为Reflection模式
  17. private boolean mReflectionMode = true;
  18. public ReflectionImage(Context context) {
  19. super(context);
  20. }
  21. public ReflectionImage(Context context, AttributeSet attrs) {
  22. super(context, attrs);
  23. //取得原始图片的bitmap并重画
  24. Bitmap originalImage = ((BitmapDrawable)this.getDrawable()).getBitmap();
  25. DoReflection(originalImage);
  26. }
  27. public ReflectionImage(Context context, AttributeSet attrs,
  28. int defStyle) {
  29. super(context, attrs, defStyle);
  30. Bitmap originalImage = ((BitmapDrawable)this.getDrawable()).getBitmap();
  31. DoReflection(originalImage);
  32. }
  33. public void setReflectionMode(boolean isRef) {
  34. mReflectionMode = isRef;
  35. }
  36. public boolean getReflectionMode() {
  37. return mReflectionMode;
  38. }
  39. //偷懒了,只重写了setImageResource,和构造函数里面干了同样的事情
  40. @Override
  41. public void setImageResource(int resId) {
  42. Bitmap originalImage = BitmapFactory.decodeResource(
  43. getResources(), resId);
  44. DoReflection(originalImage);
  45. //super.setImageResource(resId);
  46. }
  47. private void DoReflection(Bitmap originalImage) {
  48. final int reflectionGap = 4;                            //原始图片和反射图片中间的间距
  49. int width = originalImage.getWidth();
  50. int height = originalImage.getHeight();
  51. //反转
  52. Matrix matrix = new Matrix();
  53. matrix.preScale(1, -1);
  54. //reflectionImage就是下面透明的那部分,可以设置它的高度为原始的3/4,这样效果会更好些
  55. Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
  56. 0, width, height, matrix, false);
  57. //创建一个新的bitmap,高度为原来的两倍
  58. Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height), Config.ARGB_8888);
  59. Canvas canvasRef = new Canvas(bitmapWithReflection);
  60. //先画原始的图片
  61. canvasRef.drawBitmap(originalImage, 0, 0, null);
  62. //画间距
  63. Paint deafaultPaint = new Paint();
  64. canvasRef.drawRect(0, height, width, height + reflectionGap, deafaultPaint);
  65. //画被反转以后的图片
  66. canvasRef.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
  67. // 创建一个渐变的蒙版放在下面被反转的图片上面
  68. Paint paint = new Paint();
  69. LinearGradient shader = new LinearGradient(0,
  70. originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
  71. + reflectionGap, 0x80ffffff, 0x00ffffff, TileMode.CLAMP);
  72. // Set the paint to use this shader (linear gradient)
  73. paint.setShader(shader);
  74. // Set the Transfer mode to be porter duff and destination in
  75. paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
  76. // Draw a rectangle using the paint with our linear gradient
  77. canvasRef.drawRect(0, height, width, bitmapWithReflection.getHeight()
  78. + reflectionGap, paint);
  79. //调用ImageView中的setImageBitmap
  80. this.setImageBitmap(bitmapWithReflection);
  81. }
  82. }

android 圆角与倒影
http://lipeng88213.iteye.com/blog/1201993
http://www.devdiv.com/article-2516-1.html

图片倒影控件ReflectionImage相关推荐

  1. 原创“.NET研究”企业级控件库之图片浏览控件

    在上两篇:我介绍了原创企业级控件库之组合查询控件 和原创企业级控件库之大数据量分页控件,受到了很多朋友的支持,给了我很大的动力,在此我特表感谢.有的朋友要求把源码提供上来,我在第一篇就讲了,源码会在我 ...

  2. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  3. 图片盒子控件 winform 114868210

    图片盒子控件 winform 114868210 引入控件 放图片 控制图片的大小 效果 图片变的与控件一模一样大

  4. 图片剪裁控件——ClipImageView

    这段时间在做自己的项目时,须要使用到图片剪裁功能,当时大概的思考了一些需求.想到了比較简单的实现方法.因此就抽了点时间做了这个图片剪裁控件--ClipImageView 这里先贴上ClipImageV ...

  5. Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/8769904 首先题外话,今天早上起床的时候,手滑一下把我的手机甩了出去,结果陪伴我 ...

  6. Android微信九宫格图片展示控件

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/214 Android微信九宫格图片展示控件 半年前,公司产 ...

  7. 模仿微信九宫格图片展示控件

    主题 仿微信九宫格图片展示控件 github地址:点击打开链接 使用方法以及源码都在github上面

  8. MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)

    惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...

  9. Android如何设置按钮图片(控件图片)大小自适应

    Android如何设置按钮图片(控件图片)大小自适应 在你的button中放入图片:drawble属性,你可以选择它的位置上下左右, 如何让图片自适应? 把图片放入res-drawable-mipma ...

最新文章

  1. 用python下载辞典
  2. Linux系统管理(5)——使用yum快速搭建LAMP环境【方便快捷版】
  3. java自动封箱_java自动封箱是什么意思
  4. ip复原Java_Java实现 LeetCode 93 复原IP地址
  5. 制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计
  6. 金山反间谍清理专家能清除的部分恶意软件清单(截至2007年2月28日更新)
  7. 【RDMA】RDMA SEND/WRITE编程实例(IBV Verbs )
  8. 玩转python的正则表达式|提取字符串中的所有数字
  9. python爬虫58同城租房
  10. 见证边缘的力量!全球边缘计算大会•上海站顺利召开!
  11. html语言多行注释,html多行注释方法
  12. JavaScript实现购物车计算价格功能
  13. 微信端中的企业号、订阅号、服务号之前的区别
  14. loadrunnner3
  15. java 电话号码 打号_java电话号码怎么匹配?
  16. 360 全球关键信息基础设施网络安全分析报告
  17. EventBus3.0简单使用快速入门
  18. 如何在个人微信中免费接入ChatGPT
  19. 巴菲特爷爷的哲学人生
  20. 单页应用history模式nginx配置

热门文章

  1. 迅雷9设置php,Win10系统如何取消迅雷9右侧多余窗口【图文教程】
  2. Java Holder 使用
  3. SEM(结构方程模型)
  4. 古体字与简体字对照表_常用繁体字与简体字对照表
  5. appium元素坐标定位TouchAction
  6. 案例分析|戴森如何以DTC全渠道营销打造百亿规模增长
  7. MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
  8. 飞凌单片机解密_GX28E01单片机解密
  9. 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?
  10. 菜鸟教程css事件,【推荐】DIV+CSS入门菜鸟教程