GcsSloop / AndroidNote

安卓学习笔记
http://www.gcssloop.com/#blog
9.17k stars 2.14k forks source link

自定义View进阶篇-Matrix原理 错切图给错 #38

Closed luhaoaimama1 closed 8 years ago

luhaoaimama1 commented 8 years ago

http://fromwiz.com/share/s/3Hsjaq1-lQ9Q2SChN02Hkyvk09g7H73TokIK2Wsnje1-vRGw 因为这个给不了图 看完你给的错切图 我以为我以前的认知是错的呢 然后就验证了下 发现你这个图是错的 左上点没有动你这个动了 这个图很重要我只想说。。。

GcsSloop commented 8 years ago

你让图形左上角的点不要与坐标原点重合,注意示例图片中的坐标系,当图形左上角当点和坐标原点重合时,左上角的点的确不移动。

下面是当时使用的测试代码:

    private void testSkew(Canvas canvas) {
        canvas.translate(100,100);

        // 绘制坐标系
        CanvasAidUtils.setLen(900,1200);
        CanvasAidUtils.drawCoordinateSystem(canvas);

        mDeafultPaint.setColor(Color.BLACK);
        drawNet(canvas);

        Matrix matrix = canvas.getMatrix();
        matrix.preSkew(1,0,0,0);

        //canvas.skew(1, 0);
        Log.e(TAG, "testSkew: "+canvas.getMatrix().toShortString());
        canvas.setMatrix(matrix);
        //canvas.skew(1, 0);
        Log.e(TAG, "testSkew: "+canvas.getMatrix().toShortString());

        mDeafultPaint.setColor(Color.BLUE);
        drawNet(canvas);
    }

    private void drawNet(Canvas canvas){
        mDeafultPaint.setStrokeWidth(5);

        int space = 100;

        for (int i=0;i<5;i++){
            CanvasUtils.drawLine(new Point(50, 50+i*space), new Point(450, 50+i*space), canvas,mDeafultPaint);
            CanvasUtils.drawLine(new Point(50+i*space, 50), new Point(50+i*space, 450), canvas,mDeafultPaint);
        }
    }

效果:

luhaoaimama1 commented 8 years ago

非常感谢 研究了半天 也不知道正确与否?脑子大了 得下班回家了~ 最终总结: xT,yT代表 偏离Matrix 0,0坐标系的点; kx,ky是 skew的 错切系数; 考虑坐标系原点的变换,最后加上(xT,yT)+(xT_ky,yT_kx);