一、有时候我们需要创建倒影的效果,我们接触最多的都是图片能够创建倒影,而布局依然可以创建倒影。

      二、工具类代码

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader.TileMode;
import android.view.View; /**
* 创建图片倒影的方法
*
* @author
* */
public class ImageReflect {
private static int reflectImageHeight = 90;//倒影的高度 //转化为bitmap
public static Bitmap convertViewToBitmap(View paramView) {
paramView.measure(View.MeasureSpec.makeMeasureSpec(0, 0), View.MeasureSpec.makeMeasureSpec(0, 0));
paramView.layout(0, 0, paramView.getMeasuredWidth(), paramView.getMeasuredHeight());
paramView.buildDrawingCache();
return paramView.getDrawingCache();
} public static Bitmap createCutReflectedImage(Bitmap paramBitmap, int paramInt) {
int i = paramBitmap.getWidth();
int j = paramBitmap.getHeight();
Bitmap localBitmap2 = null;
if (j <= paramInt + reflectImageHeight) {
localBitmap2 = null;
} else {
Matrix localMatrix = new Matrix();
localMatrix.preScale(1.0F, -1.0F);
// System.out.println(j - reflectImageHeight -
// paramInt);
Bitmap localBitmap1 = Bitmap.createBitmap(paramBitmap, 0, j - reflectImageHeight - paramInt, i, reflectImageHeight, localMatrix, true);
localBitmap2 = Bitmap.createBitmap(i, reflectImageHeight, Bitmap.Config.ARGB_8888);
Canvas localCanvas = new Canvas(localBitmap2);
localCanvas.drawBitmap(localBitmap1, 0.0F, 0.0F, null);
LinearGradient localLinearGradient = new LinearGradient(0.0F, 0.0F, 0.0F, localBitmap2.getHeight(), -2130706433, 16777215, TileMode.CLAMP);
Paint localPaint = new Paint();
localPaint.setShader(localLinearGradient);
localPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
localCanvas.drawRect(0.0F, 0.0F, i, localBitmap2.getHeight(), localPaint);
if (!localBitmap1.isRecycled())
localBitmap1.recycle();
System.gc();
}
return localBitmap2;
} public static Bitmap createReflectedImage(Bitmap paramBitmap, int paramInt) {
int i = paramBitmap.getWidth();
int j = paramBitmap.getHeight();
Bitmap localBitmap2;
if (j <= paramInt) {
localBitmap2 = null;
} else {
Matrix localMatrix = new Matrix();
localMatrix.preScale(1.0F, -1.0F);
Bitmap localBitmap1 = Bitmap.createBitmap(paramBitmap, 0, j - paramInt, i, paramInt, localMatrix, true);
localBitmap2 = Bitmap.createBitmap(i, paramInt, Bitmap.Config.ARGB_8888);
Canvas localCanvas = new Canvas(localBitmap2);
localCanvas.drawBitmap(localBitmap1, 0.0F, 0.0F, null);
LinearGradient localLinearGradient = new LinearGradient(0.0F, 0.0F, 0.0F, localBitmap2.getHeight(), -2130706433, 16777215, TileMode.CLAMP);
Paint localPaint = new Paint();
localPaint.setShader(localLinearGradient);
localPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
localCanvas.drawRect(0.0F, 0.0F, i, localBitmap2.getHeight(), localPaint);
}
return localBitmap2;
} public static Bitmap createReflectedImage(Bitmap originalImage) { final int reflectionGap = 4; int width = originalImage.getWidth();
int height = originalImage.getHeight(); Matrix matrix = new Matrix();
matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
height / 2, width, height / 2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
(height + height / 2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(originalImage, 0, 0, null); Paint defaultPaint = new Paint();
canvas.drawRect(0, height, width, height + reflectionGap, defaultPaint); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0,
originalImage.getHeight(), 0, bitmapWithReflection.getHeight()
+ reflectionGap, 0x70ffffff, 0x00ffffff,
TileMode.MIRROR); paint.setShader(shader); paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
+ reflectionGap, paint); return bitmapWithReflection;
}
}

  三、这里面有很多种方法,可以自己根据需求去选择。

      调用示例:

      ps:我这是创建多个倒影,所以用了一个for循环。循环操作的是两个图片数组。

for (int k = 0; k < REFLECT_COUNT; k++) {
arrayOfImageView[k].setImageBitmap(ImageReflect.createCutReflectedImage(ImageReflect.convertViewToBitmap(imagereflect[k]), 0));
}

Android中创建倒影效果的工具类的更多相关文章

  1. 转--Android中调用webservice的工具类

    最近学习WebService,感觉利用这个借口开发网站的Android客户端方便及了,用到一个工具类,这里铭记一下. public static final String WebServiceName ...

  2. Android中经常使用的工具类02

    1.读取手机联系人信息 一般用在读取手机通讯录上传,这一块比較多. import java.util.ArrayList; import java.util.List; import android. ...

  3. 获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录

    获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录 ===========================获取全局上下文(getA ...

  4. Android DevArt5:如何在Android中创建多线程?

    本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...

  5. Android中创建PopupMenu弹出式菜单

    之前写过一篇创建option menu的文章:Android中创建option menu 本文主要是讲如何创建PopupMenu弹出式菜单 1.首先创建menu文件menu2.xml: <?xm ...

  6. Hutool中那些常用的工具类和方法

    Hutool中那些常用的工具类和方法 Hutool是一个Java工具包,它帮助我们简化每一行代码,避免重复造轮子.如果你有需要用到某些工具方法的时候,不妨在Hutool里面找找,可能就有.本文将对Hu ...

  7. 编写Java程序,创建一个数学工具类,将该类设计为final类,Final 修饰符的使用。

    返回本章节 返回作业目录 需求说明: 创建一个数学工具类. 将该类设计为final类. 将该类的构造方法的访问权限定义为私有,以防止外界实例化该类. 在该类定义静态double类型常量π,其值为3.1 ...

  8. 获取Spring容器中Bean实例的工具类(Java泛型方法实现)

    在使用Spring做IoC容器的时候,有的类不方便直接注入bean,需要手动获得一个类型的bean. 因此,实现一个获得bean实例的工具类,就很有必要. 以前,写了一个根据bean的名称和类型获取b ...

  9. commons-collections包中的常用的工具类

    commons-collections包中的常用的工具类 <dependency> <groupId>commons-collections</groupId> & ...

随机推荐

  1. SharePoint 2013 开启访问请求 链接丢失

    关于SharePoint 2013 开启访问请求的做法其实很简单,比如http://www.cnblogs.com/jianyus/archive/2014/06/21/3799386.html 这篇 ...

  2. windows钩子(转)

    1. 消息钩子 提示: 如果要设置系统级钩子, 钩子函数必须在 DLL 中. SetWindowsHookEx(   idHook: Integer;  {钩子类型}   lpfn: TFNHookP ...

  3. 自动化打包 Jenkins 持续集成 Git Gradle MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. Proguard使用最新,最全教程,亲自试验

    最近公司有一个项目,是外包项目,由于对方也有技术人员,出于技术上的保密,需要对class文件进行二次处理,于是网上找了好久,只发现Proguard是用的最广泛而且网上资料最多的.由于不是纯JAVA项目 ...

  5. Qt学习之路(28): 坐标变换

    经过前面的章节,我们已经能够画出一些东西来,主要就是使用QPainter的相关函数.今天,我们要看的是QPainter的坐标系统.   同很多坐标系统一样,QPainter的默认坐标的原点(0, 0) ...

  6. 大数据开发实战:MapReduce内部原理实践

    下面结合具体的例子详述MapReduce的工作原理和过程. 以统计一个大文件中各个单词的出现次数为例来讲述,假设本文用到输入文件有以下两个: 文件1: big data offline data on ...

  7. Laravel学习笔记之Session源码解析(下)

    说明:在中篇中学习了session的CRUD增删改查操作,本篇主要学习关闭session的相关源码.实际上,在Laravel5.3中关闭session主要包括两个过程:保存当前URL到session介 ...

  8. [PureScript] Introduce to PureScript Specify Function Arguments

    JavaScript does its error-checking at runtime, but PureScript has a compiler, which makes sure that ...

  9. Mac 隐私与安全没有允许任何来源选项

    mac 允许任何来源的 app 在 macOS Sierra 10.12 及之后的版本,都没有 打开任何来源 的选项,解决方法: 终端执行命令: sudo spctl --master-disable

  10. 5个经典的JavaScript面试题

    在IT界中公司对JavaScript开发者的要求还是比较高的,但是如果JavaScript开 发者的技能和经验都达到了一定的级别,那他们还是很容易跳到优秀的公司的,当然薪水就更不是问题了.但是在面试之 ...