下面使用三个小例子作为讲解:
1.translate:将canvas默认的原点(0,0),进行移动
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
public class TranslateDemo extends View {
Paint mPaint;
// 刻度尺高度
private static final int RULE_HEIGHT = ;
private static final int SUM_IN_MM = ;
int mTotalWidth = ;
int mRuleLeftMargin = ;
// 厘米之间的像素数
int mLineInterval = ;
public TranslateDemo(Context context) {
super(context);
initData(context);
}
private void initData(Context context) {
mTotalWidth = mRuleLeftMargin * + mLineInterval * SUM_IN_MM;
mPaint = new Paint();
mPaint.setARGB(, , , );
}
public TranslateDemo(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initData(context);
}
public TranslateDemo(Context context, AttributeSet attrs) {
super(context, attrs);
initData(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.BLACK);
canvas.translate(, RULE_HEIGHT);
canvas.drawLine(, , mTotalWidth, , mPaint);
drawLines(canvas);
}
private void drawLines(Canvas canvas) {
// 刻度线的长度
int ruleLength = ;
canvas.save();
canvas.translate(mRuleLeftMargin, );
for (int i = ; i <= SUM_IN_MM; i++) {
if (i % == ) {
ruleLength = ;
} else if (i % == ) {
ruleLength = ;
} else {
ruleLength = ;
}
canvas.drawLine(, , , -ruleLength, mPaint);
canvas.translate(mLineInterval, );
}
canvas.restore();
}
}
2.scale:将canvas进行缩放
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
public class ScaleDemo extends View {
Paint mPaint;
final int TOTAL_SQUARE_COUNT = ;
int mHalfWidth = ;
int mHalfHeight = ;
public ScaleDemo(Context context) {
super(context);
initData(context);
}
private void initData(Context context) {
mPaint = new Paint();
mPaint.setARGB(, , , );
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth();
DisplayMetrics metric = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay()
.getMetrics(metric);
mHalfHeight = metric.heightPixels / ;
mHalfWidth = metric.widthPixels / ;
}
public ScaleDemo(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initData(context);
}
public ScaleDemo(Context context, AttributeSet attrs) {
super(context, attrs);
initData(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.BLUE);
drawSquare(canvas);
}
private void drawSquare(Canvas canvas) {
canvas.translate(mHalfWidth, mHalfHeight);
for (int i = ; i < TOTAL_SQUARE_COUNT; i++) {
// 保存画布
canvas.save();
float fraction = (float) i / TOTAL_SQUARE_COUNT;
// 将画布以正方形中心进行缩放
canvas.scale(fraction, fraction, , );
canvas.drawCircle(, , , mPaint);
// 画布回滚
canvas.restore();
}
}
}
3.rotate进行旋转
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
public class RotateDemo extends View {
Paint mPaint;
final int TOTAL_SQUARE_COUNT = ;
int mHalfWidth = ;
int mHalfHeight = ;
public RotateDemo(Context context) {
super(context);
initData(context);
}
private void initData(Context context) {
mPaint = new Paint();
mPaint.setARGB(, , , );
mPaint.setStyle(Style.STROKE);
mPaint.setStrokeWidth();
DisplayMetrics metric = new DisplayMetrics();
((Activity) context).getWindowManager().getDefaultDisplay()
.getMetrics(metric);
mHalfHeight = metric.heightPixels / ;
mHalfWidth = metric.widthPixels / ;
}
public RotateDemo(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initData(context);
}
public RotateDemo(Context context, AttributeSet attrs) {
super(context, attrs);
initData(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.BLUE);
canvas.translate(mHalfWidth, mHalfHeight);
canvas.drawCircle(, , mHalfWidth, mPaint);
drawLines(canvas);
}
public void drawLines(Canvas canvas) {
canvas.save();
int lineLength = ;
for (int i = ; i < ; i++) {
if (i % == ) {
lineLength = ;
} else {
lineLength = ;
}
canvas.drawLine(-mHalfWidth, ,
-mHalfWidth + lineLength, , mPaint);
canvas.rotate();
}
canvas.restore();
}
}