android學習7——canvas.concat(Matrix matrix)作用


canvas.concat的作用可以理解成對matrix的變換應用到canvas上的所有對象.
看下面的代碼.

public class ConcatMatrixActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(new ConcatMatrixView(this));
    }
}
public class ConcatMatrixView extends View {
    private Matrix matrix = new Matrix();
    private Paint bgPaint = new Paint();

    public ConcatMatrixView(Context context) {
        super(context);
        matrix.setScale(2f, 2f);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        bgPaint.setColor(Color.RED);
        canvas.drawRect(0, 0, 100, 100, bgPaint);

        canvas.save();
        canvas.concat(matrix);
        canvas.drawRect(100, 100, 200, 200, bgPaint);
        canvas.restore();

        canvas.drawRect(400, 400, 500, 500, bgPaint);
    }
}

以上代碼對matrix的x和y坐標都拉伸了2倍.變化的效果如下所示:

在沒有concat的情況下canvas.drawRect(100, 100, 200, 200, bgPaint);是在(100, 100), (200, 200)的區域下畫一個矩形.因為執行了matrix.setScale(2f, 2f)所以matrix的x和y坐標都拉伸了2倍.這時候在concat的作用下canvas.drawRect(100, 100, 200, 200, bgPaint)變成了在(200, 200), (400, 400)的區域上畫矩形.
同理,如果把對matrix的變換由matrix.setScale(2f, 2f)改成matrix.setTranslate(100f, 100f),效果如下所示:

x軸和y軸坐標都移動了100個像素.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM