下面使用三個小例子作為講解:
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();
}
}