Matrix
-
Matrix是什么?
Matrix也就是矩阵的意思,其实我们通常使用它进行一些图形变换的操作,例如:旋转,平移,缩放,错切等 -
Matrix可以实现什么效果?
图片的平移,旋转,缩放,错切,图片水印等效果
-
常用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;
}
}
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的功能:
图片浏览查看
双指缩放
单点触摸缩放
图片缩放模式设置
来源:https://blog.csdn.net/weixin_44419661/article/details/99674232