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

      二、工具类代码

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. Html-文档类型(DTD)和DOCTYPE

    在正式介绍文档类型(DTD)和DOCTYPE之前,我们需要先了解HTML和XHTML的之间的区别,现在Html5已经慢慢的成为主流,之前的数十年一直都是Html4.01的天下,Html4.01于199 ...

  2. 手把手实现腾讯qq拖拽删去效果(二)

    这节,就一个任务如何把上节自定义的翻页动画控件整进下拉列表中去. 由于是自定义的下拉列表控件,我们需要自定义能够上啦下滑的listview,这势必会造成这个问题,上拉刷新要响应相应touch事件,拖拽 ...

  3. 大数据开发实战:Hive表DDL和DML

    1.Hive 表 DDL 1.1.创建表 Hive中创建表的完整语法如下: CREATE [EXTERNAL] TABLE [IF NOT EXISTS]  table_name [ (col_nam ...

  4. Tensorflow LSTM实现

    Tensorflow[LSTM]   0.背景 通过对<tensorflow machine learning cookbook>第9章第3节"implementing_lstm ...

  5. Sql Server重复数据删除

    --在sql2005下可以 ,sql2000不可以 create  table tb(id int,name varchar(4))insert tb select 1,'aa'union all s ...

  6. [React] Validate React Forms with Formik and Yup

    Validating forms in React can take several lines of code to build. However, Formik's ErrorMessage co ...

  7. GPUImage API文档之GPUImageFramebufferCache类

    GPUImageFramebufferCache类负责管理GPUImageFramebuffer对象,是一个GPUImageFramebuffer对象的缓存. 方法 - (GPUImageFrameb ...

  8. OpenGL ES 3.0之VertexAttributes,Vertex Arrays,and Buffer Objects(九)

    顶点数据,也称为顶点属性,指每一个顶点数据.指能被用来描述每个顶点的数据,或能被所有顶点使用的常量值.例如你想绘制一个具有颜色的立方体三角形.你指定一个恒定的值用于三角形的所有三个顶点颜色.但三角形的 ...

  9. Vim的行号、语法显示等设置(.vimrc文件的配置)以及乱码解决

    在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进 等功能的.为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc.在启动vim时,当前用户 ...

  10. SpringBoot添加对jsp的支持

    1.在pom.xml添加如下内容: <dependency> <groupId>org.apache.tomcat.embed</groupId> <arti ...