天天看點

Canvas translate,scale,rotate

下面使用三個小例子作為講解:

1.translate:将canvas預設的原點(0,0),進行移動

Canvas translate,scale,rotate
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進行縮放

Canvas translate,scale,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.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進行旋轉

Canvas translate,scale,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();

    }

}