day40 matrix,photoview的基本使用

本文介绍了Android中Matrix的使用,包括平移、扭曲、旋转和缩放等图形变换操作,以及如何实现图片水印效果。此外,还详细讲解了PhotoView库的集成与功能,如双指缩放、单点触摸缩放和图片模式设置,以实现高级的图片浏览体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Matrix

  1. Matrix是什么?
    Matrix也就是矩阵的意思,其实我们通常使用它进行一些图形变换的操作,例如:旋转,平移,缩放,错切等

  2. Matrix可以实现什么效果?

    图片的平移,旋转,缩放,错切,图片水印等效果

  3. 常用api?

    Matrix的动作有三种,分别是:pre ,post,set

    (1). pre 代表着如果之前有过操作,乖乖排队。

    (2). post 代表着插队到第一个。

    (3). set 代表着,设置

平移(Translation)变换

Translation的变换是通过改变MTRANS_X和MTRANS_Y来实现的,Matrix提供了三个方法
preTranslate(float dx, float dy)
setTranslate(float dx, float dy)
postTranslate(float dx, float dy)

扭曲(Skew)变换

skew变换是通过改变MSKEW_X,和MSKEW_Y来实现的,Matrix提供了下面的几个方法来设置skew

 matrix.setSkew(kx,ky)

 matrix.setSkew(kx,ky, px, py)

 matrix.preSkew(kx,ky)

 matrix.preSkew(kx,ky, px, py)

 matrix.postSkew(kx,ky)

 matrix.postSkew(kx,ky, px, py)

skew的变换是如下的规律:
点(x,y)经过skew(kx,ky,px,py)变换之后,坐标为(kx*(y-py)+px,ky*(x-px)+py),如果,px和py没有,则默认为都为0。

旋转(Rotate)的变换

matrix.setRotate(degrees)

matrix.setRotate(degrees, px, py)

matrix.preRotate(degrees)

matrix.preRotate(degrees, px, py)

matrix.postRotate(degrees)

matrix.postRotate(degrees, px, py)

degrees即我们要旋转的度数,px,py是我们旋转的角度通过这个设置

缩放

setScale(float sx,float sy, float px, float py) 

setScale(float sx,float sy);

sx,sy 缩放的倍数,px,py中心点

自定义ImageView

package com.example.matrixdemo;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.ImageView;

@SuppressLint("AppCompatCustomView")
public class MainImageView extends ImageView {

    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Matrix matrix = new Matrix();
    private Bitmap bitmap;

    public MainImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
    }

    //平移方法
    public void translationBitmap(){
        //dx与dy->x轴与y轴平移的像素->
        matrix.reset();
        matrix.preTranslate(100f,100f);
        invalidate();//重新绘制view
    }
    //缩放方法
    public void scallBitmap(){
        matrix.reset();
        matrix.preScale(2f,2f,bitmap.getWidth()/2,bitmap.getHeight()/2);
        invalidate();
    }
    //旋转方法
    public void rotateBitmap(){
        matrix.reset();
        matrix.preRotate(180,bitmap.getWidth()/2,bitmap.getHeight()/2);
        invalidate();

    }
    //错切方法
    public void skewBitmap(){
        matrix.reset();
        matrix.preSkew(2,2);
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(bitmap,matrix,paint);
        super.onDraw(canvas);

    }
}

activity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private MainImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = findViewById(R.id.img);
        findViewById(R.id.btn1).setOnClickListener(this);
        findViewById(R.id.btn2).setOnClickListener(this);
        findViewById(R.id.btn3).setOnClickListener(this);
        findViewById(R.id.btn4).setOnClickListener(this);
        findViewById(R.id.btn5).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id){
            case R.id.btn1:
                img.translationBitmap();
                break;
            case R.id.btn2:
                img.scallBitmap();
                break;
            case R.id.btn3:
                img.rotateBitmap();
                break;
            case R.id.btn4:
                img.skewBitmap();
                break;
            case R.id.btn5:
                img.setImageBitmap(buildBitmap(
                        BitmapFactory.decodeResource(getResources(),R.mipmap.apply_return_flowdetail)
                        ,BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)));
                break;
        }
    }

    //合成水印
    private Bitmap buildBitmap(Bitmap old,Bitmap now){
        Bitmap bitmap = null;
        //ARGB_8888->4字节 ARGB_4444 RGB_565 ->2字节
        //RGB->JPG
        //ARGB->PNG->存在透明通道
        bitmap = Bitmap.createBitmap(old.getWidth(),
                old.getHeight(),Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawBitmap(old,0,0,null);
        canvas.drawBitmap(now,10,10,null);
        canvas.save();
        return bitmap;
    }
}

补:
倒影

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), Bitmap.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,
            Shader.TileMode.MIRROR);

    paint.setShader(shader);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
            + reflectionGap, paint);
    return bitmapWithReflection;
}

水印:

@SuppressLint("AppCompatCustomView")
public class MyImg extends ImageView {

    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Matrix matrix;
    private Bitmap bitmap,bitmap1;

    public MyImg(Context context, AttributeSet attrs) {
        super(context, attrs);
        matrix = new Matrix();
        bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.tou1).copy(Bitmap.Config.ARGB_8888,true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(bitmap,matrix,paint);
        super.onDraw(canvas);
    }

    public void addWater(){
        Canvas canvas = new Canvas(bitmap);
        bitmap1 = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
        Paint paint1 = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN));
        canvas.drawBitmap(bitmap1,10,10,paint1);
        invalidate();
    }

}

photoView

官网:https://github.com/chrisbanes/PhotoView

project的gradle

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

依赖:implementation ‘com.github.chrisbanes:PhotoView:2.1.2’

PhotoView的功能:

图片浏览查看
双指缩放
单点触摸缩放
图片缩放模式设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值