项目中要用到倒影效果,在网上搜到了很多不错的例子。后来感觉不适合我,经过了自己的理解和改造。
1、生成含原图+倒影的bitmap返回。
2、生成只含倒影部分的bitmap返回。
不难,代码注视详细,直接贴代码,即插即用。
package com.znke.tv3_test.utils;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader;
/**
* @DateTime: 2016-07-20 09:35
* @Author: duke
* @Deacription: 生成倒影
*/
public class InverteImageUtil {
/**
* 生产倒影bitmap
* @param originalImage 原始bitmap
* 默认参数:生成的倒影中默认包含原始bitmap
* 默认参数:生成的倒影部分是原图的 1/4
* @return 倒影bitmap,包含原图
*/
public static Bitmap createReflectedImage(Bitmap originalImage) {
//倒影的高度(原图的1/4)
int inverteHeight = 4;
return createReflectedImage(originalImage, inverteHeight, true);
}
/**
* 生产倒影bitmap
* @param originalImage 原始bitmap
* 默认参数:生成的倒影中是否包含原始bitmap
* 默认参数:生成的倒影部分是原图的 1/4
* @return 倒影bitmap,包含原图
*/
public static Bitmap createReflectedImage(Bitmap originalImage,boolean isWithOriginalBitmap) {
//倒影的高度(原图的1/4)
int inverteHeight = 4;
return createReflectedImage(originalImage, inverteHeight, isWithOriginalBitmap);
}
/**
* 生产倒影bitmap
*
* @param originalImage 原始bitmap
* @param isWithOriginalBitmap 生成的倒影中是否包含原始bitmap
* @param inverteHeight 生成的倒影部分是原图的 1/inverteHeight
* @return 倒影bitmap
*/
public static Bitmap createReflectedImage(Bitmap originalImage, int inverteHeight, boolean isWithOriginalBitmap) {
//倒影的高度(原图的1/4)
/*int inverteHeight = 4;*/
//原图与倒影之间的间隙
final int reflectionGap = 4;
// 获得图片的长宽
int width = originalImage.getWidth();
int height = originalImage.getHeight();
//创建变换矩阵
Matrix matrix = new Matrix();
// 实现图片翻转90度
matrix.preScale(1, -1);
// 创建倒影图片(是原始图片的1/x大小,需要的区域的起始坐标和宽高)
Bitmap reflectionImage = Bitmap.createBitmap(originalImage, //原图
0, /*从x的0位置开始绘画*/
height / inverteHeight * (inverteHeight - 1), /*从原图的最下部分 (x-1)/x 开始绘画,只倒影原图下边的1/x*/
width, /*全部宽度,与1/x部分一致*/
height / inverteHeight, /*1/x高度,与1/x部分一致*/
matrix, false);
// 创建总图片(原图片? + 倒影图片)
int resultHeight;
if (isWithOriginalBitmap) {
resultHeight = height + height / inverteHeight;
} else {
resultHeight = height / inverteHeight;
}
Bitmap finalReflection = Bitmap.createBitmap(width, resultHeight, Bitmap.Config.ARGB_8888);
// 创建画布
Canvas canvas = new Canvas(finalReflection);
//创建线性渐变LinearGradient对象
LinearGradient shader;
if(isWithOriginalBitmap){
//把原图画到画布上
canvas.drawBitmap(originalImage, 0, 0, null);
//把倒影图片画到画布上
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
shader = new LinearGradient(0, originalImage.getHeight(), 0,
finalReflection.getHeight() + reflectionGap,
0x90ffffff, 0x00ffffff, Shader.TileMode.MIRROR);
}else{
//把倒影图片画到画布上
canvas.drawBitmap(reflectionImage, 0, 0, null);
shader = new LinearGradient(0, 0, 0,
finalReflection.getHeight(),
0x90ffffff, 0x00ffffff, Shader.TileMode.MIRROR);
}
//创建带渐变的画笔
Paint shaderPaint = new Paint();
shaderPaint.setShader(shader);
shaderPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
if(isWithOriginalBitmap){
//画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果。
canvas.drawRect(0, height + reflectionGap, width, finalReflection.getHeight(), shaderPaint);
}else{
//画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果。
canvas.drawRect(0, 0, width, finalReflection.getHeight(), shaderPaint);
}
return finalReflection;
}
}