android图片倒影代码,注释

记录下android图片倒影代码,基本上代码都是copy的。只是做个记录下次不用重新理解代码。

首先在xml文件中添加一个imageview,这个不多说,应该看得懂

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="cc.lotuscard.myapptvtest.MainActivity">


    <ImageView
        android:id="@+id/daoying"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:srcCompat="@drawable/testImage"
        tools:layout_editor_absoluteX="111dp"
        tools:layout_editor_absoluteY="67dp" />
</android.support.constraint.ConstraintLayout>

在xml中创建好ImageView之后在Activity中去获取到该控件

     private ImageView daoying;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        daoying = (ImageView)findViewById(R.id.daoying);
    }

获取该控件之后开始写得到图片倒影的方法DoReflection():方法的返回值可以是空,可以是返回Bitmap对象。最好是返回Bitmap对象,可以供不同控件使用。

private Bitmap DoReflection(Bitmap originalImage) {
        //设置图片和倒影之间的间隙
        final int reflectionGap = 4;
        //获得图片的宽高
        int width = originalImage.getWidth();
        int height = originalImage.getHeight();
        Matrix matrix = new Matrix();
        matrix.preScale(1, -1.5f);//实现图片的反转
        // 创建反转后的图片Bitmap对象,图片高是原图
        //这里的height应该是为倒影图片从原图倒影过来时的高度起点位置,应该是倒过来的。但是不能为0
        Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
                0, width, height , matrix, false);
        // 创建标准的Bitmap对象,宽和原图一致,高是原图的0.3333倍
        // 这里的height/3是用来控制倒影的从原点开始的1/3高度
        Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                height / 3, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmapWithReflection);
        canvas.drawBitmap(originalImage, 0, 0, null);// 创建画布对象,将原图画于画布,起点是原点位置

        Paint defaultPaint = new Paint();
        canvas.drawRect(0, 0, width, height , defaultPaint);
        // 将反转后的图片画到画布中
        canvas.drawBitmap(reflectionImage, 0, 0, null);
        Paint paint = new Paint();
        // 创建线性渐变LinearGradient对象
        LinearGradient shader = new LinearGradient(0,
                0, 0, originalImage.getHeight()/3
                , 0x70000000, 0x00000000,
                Shader.TileMode.MIRROR);
        // 绘制
        paint.setShader(shader);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        // 画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果
        canvas.drawRect(0, 0, width, bitmapWithReflection.getHeight()
                , paint);
        return bitmapWithReflection;
    }

这就是基本的代码了
最后粘上全部的代码,避免下次使用时忘记了

public class MainActivity extends AppCompatActivity {
    private ImageView daoying;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取图片控件
        daoying = (ImageView)findViewById(R.id.daoying);
        //获得该控件原本的图片
        Bitmap originalImage = ((BitmapDrawable) daoying.getDrawable()).getBitmap();
        DoReflection(originalImage);
    }
    private void DoReflection(Bitmap originalImage) {
        //设置图片和倒影之间的间隙
        final int reflectionGap = 4;
        //获得图片的宽高
        int width = originalImage.getWidth();
        int height = originalImage.getHeight();
        Matrix matrix = new Matrix();
        matrix.preScale(1, -1);//实现图片的反转
        // 创建反转后的图片Bitmap对象,图片高是原图的高度
        //这里的高度height应该是图片倒影起点高度,但是不能为0
        Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,
                0, width, height, matrix, false);
        // 创建标准的Bitmap对象,宽和原图一致,高是原图的0.25倍
        //倒影图片的高度占比,这里只取了原图的1/4部分
        Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                height / 4, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmapWithReflection);
        canvas.drawBitmap(originalImage, 0, 0, null);// 创建画布对象,将原图画于画布,起点是原点位置

        Paint defaultPaint = new Paint();
        canvas.drawRect(0, 0, width, height , defaultPaint);
        // 将反转后的图片画到画布中
        canvas.drawBitmap(reflectionImage, 0, 0, null);
        Paint paint = new Paint();
        // 创建线性渐变LinearGradient对象
        LinearGradient shader = new LinearGradient(0,
                0, 0, originalImage.getHeight()/4
                , 0x70ffffff, 0x00ffffff,
                Shader.TileMode.MIRROR);
        // 绘制
        paint.setShader(shader);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
        // 画布画出反转图片大小区域,然后把渐变效果加到其中,就出现了图片的倒影效果
        canvas.drawRect(0, 0, width, bitmapWithReflection.getHeight()
                , paint);
        daoying.setImageBitmap(bitmapWithReflection);
    }
}

这里是不是将原图和倒影放在一起的,分开来放,在项目需求中原图在选中时会加上焦点框,因此分成两个ImageView,这里只写了倒影部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值