欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android如何进行图片添加倒影效果

程序员文章站 2022-04-02 23:41:44
给图片添加倒影效果怎么实现呢?我们先看下效果图: 注释很详细,就不多说了。具体实现代码如下: package com.example.specialeffect_ref...

给图片添加倒影效果怎么实现呢?我们先看下效果图:
Android如何进行图片添加倒影效果

注释很详细,就不多说了。具体实现代码如下:

package com.example.specialeffect_reflectedimages;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.os.Bundle;
import android.widget.ImageView;

/*
 * 为图片添加倒影
 */

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Bitmap bitmap = createReflectedBitmap(R.drawable.dog);
        ImageView imageView = (ImageView) findViewById(R.id.ivTest);
        imageView.setImageBitmap(bitmap);
    }

    /**
     * @param imgId 图片资源id
     * @return Bitmap 带倒影的Bitmap
     */
    private Bitmap createReflectedBitmap(int imgId){
        Bitmap originalImage = BitmapFactory.decodeResource(getResources(), imgId);
        // 反射图片和原始图片中间的间距
        final int reflectionGap = 4;
        int width = originalImage.getWidth();
        int height = originalImage.getHeight();

        //通过矩阵对图像进行变换
        Matrix matrix = new Matrix();
        // 第一个参数为1,表示x方向上以原比例为准保持不变,正数表示方向不变。
        // 第二个参数为-1,表示y方向上以原比例为准保持不变,负数表示方向取反。
        matrix.preScale(1, -1); // 实现图片的反转

        // 创建反转后的图片Bitmap对象,图片高是原图的一半
        Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
                height / 2, width, height / 2, matrix, false);

        // 创建标准的Bitmap对象,宽和原图一致,高是原图的1.5倍
        Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                (height + height / 2), Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmapWithReflection);
        canvas.drawBitmap(originalImage, 0, 0, null);

        Paint deafaultPaint = new Paint();
        canvas.drawRect(0, height, width, height + reflectionGap, deafaultPaint);
        // 将反转后的图片画到画布中
        canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);

        Paint paint = new Paint();
        // 创建线性渐变LinearGradient 对象。
        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;
    }
}

布局文件: