Matrix 矩阵
缩放(Scale)
对应 MSCALE_X 与 MSCALE_Y
位移(Translate)
对应 MTRANS_X 与 MTRANS_Y
错切(Skew)
对应 MSKEW_X 与 MSKEW_Y
旋转(Rotate)
旋转没有专门的数值来计算,Matrix 会通过计算缩放与错切来处理旋转。
详细代码
1.自定义View
@SuppressLint("AppCompatCustomView")
public class MatrixImageView extends ImageView {
Matrix matrix;
Paint paint ;
Bitmap bitmap;
int defaultHeight = 500; //默认宽高
int defaultWidth = 500; //默认宽高
public MatrixImageView(Context context) {
super(context);
init();
}
public MatrixImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bitmap,matrix,paint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
int wSize = MeasureSpec.getSize(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
if(wMode == MeasureSpec.AT_MOST)
{
defaultWidth = wSize;
}
if(hMode == MeasureSpec.AT_MOST){
defaultHeight = hSize;
}
setMeasuredDimension(defaultWidth,defaultHeight);
}
/**
* 初始化
*/
public void init(){
matrix = new Matrix();
paint = new Paint();
bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
}
/**
* 旋转
*/
public void imageRotate(){
matrix.reset();
matrix.setRotate(30);
invalidate();
}
/**
* 平移
*/
public void imageTranslate(){
matrix.reset();
matrix.setTranslate(100,100);
invalidate();
}
/**
* 缩放
*/
public void imageScale(){
matrix.reset();
matrix.setScale(0.5f,0.5f);
invalidate();
}
/**
* 错切
*/
public void imageSkew(){
matrix.reset();
matrix.setSkew(0.3F,0.3F);
invalidate();
}
}
2.Activity
public class MatrixActivity extends AppCompatActivity {
@BindView(R.id.btn_scale)
Button buttonScale;
@BindView(R.id.btn_translate)
Button buttonTranslate;
@BindView(R.id.btn_skew)
Button buttonSkew;
@BindView(R.id.btn_rotate)
Button buttonRotate;
@BindView(R.id.matrix_image)
MatrixImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_matrix);
ButterKnife.bind(this);
}
@OnClick(R.id.btn_scale)
public void scale(View view){
imageView.imageScale();
Log.d("amy", "scale: ");
}
@OnClick(R.id.btn_translate)
public void translate(View view){
imageView.imageTranslate();
Log.d("amy", "translate: ");
}
@OnClick(R.id.btn_skew)
public void skew(){
imageView.imageSkew();
Log.d("amy", "imageSkew: ");
}
@OnClick(R.id.btn_rotate)
public void rotate(){
imageView.imageRotate();
Log.d("amy", "imageRotate: ");
}
}
PhotoView
依赖:implementation ‘com.github.chrisbanes:PhotoView:2.0.0’
<LinearLayout 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=".PotoViewActivity">
<com.github.chrisbanes.photoview.PhotoView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/image1"/>
</LinearLayout>
说明:直接使用,可放大缩小