Android 倒影绘制-工具类

项目中要用到倒影效果,在网上搜到了很多不错的例子。后来感觉不适合我,经过了自己的理解和改造。

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;
    }
}


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值