前两篇介绍了Paint(画笔)类、Canvas(画布)类、Bitmap(位图)类、BitmapFactory(位图工具)类,以及绘制图形、路径、文字等方法,这一篇在此基础上介绍Matrix(android.graphics.Matrix)类,完成图片的旋转、缩放、倾斜、平移。
旋转
setRotate()、postRotate()、preRotate()均可完成,仅名不同,语法格式均相同
setRotate()为例介绍两种重构的方法,另外两个相同
方法 | 描述 |
---|---|
setRotate(float degrees) | 参数为度数 |
setRotate(float degrees , float px,float py) | 参数为度数,轴心 |
如果在使用布局引用Canvas类时出现类似错误,则是Canvas类中缺少了一个必须的构造:
android.view.InflateException: Binary XML file line #9: Error inflating class com.example.newland.f20190818.MyView
public 类名(Context context, AttributeSet attrs) {
super(context, attrs);
}
例子:左上角顺时针旋转
Canvas继承类
package com.example.newland.f20190818;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
Matrix matrix = new Matrix();
matrix.setRotate(45);
canvas.drawBitmap(bitmap,matrix,paint);
}
}
主活动类:
package com.example.newland.f20190818;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
主布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.example.newland.f20190818.MyView
android:layout_margin="45px"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
效果:
缩放
setScle() 、postScle()、preScle()均可完成,仅名不同,语法格式均相同
方法 | 描述 |
---|---|
setScle( float sx,float sy,float px,float py) | 以px与py为轴心进行缩放,sx,sy指定缩放比例 |
setScle( float sx,float sy) | sx,sy指定缩放比例 |
例子:指定比例缩放(这里只放关键类代码,其他代码与之前的相同)
Canvas 继承类
package com.example.newland.f20190818;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
Matrix matrix = new Matrix();
matrix.setScale(0.6f,0.3f);
canvas.drawBitmap(bitmap,matrix,paint);
}
}
效果:
倾斜
setSkew()、postSkew()、preSkew()均可完成,仅名不同,语法格式均相同
方法 | 描述 |
---|---|
setSkew( float kx,float ky,float px,float py) | 以px与py为轴心进行倾斜,sx,sy指定X,Y的倾斜量 |
setSkew( float kx,float ky) | kx,ky指定X,Y倾斜量 |
例子:以0,0为轴心倾斜
package com.example.newland.f20190818;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
Matrix matrix = new Matrix();
matrix.setSkew(2,1,0,0);
canvas.drawBitmap(bitmap,matrix,paint);
}
}
效果图:
平移
setTranslate()、postTranslate()、preTranslate()均可完成,仅名不同,语法格式均相同
setTranslate(float dx,float dy)//dx,dy为平移到的坐标
例子:
package com.example.newland.f20190818;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher);
Matrix matrix = new Matrix();
matrix.setTranslate(100,100);
canvas.drawBitmap(bitmap,matrix,paint);
}
}
效果: