GcsSloop / AndroidNote

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

Picture 的 beginRecording(width,height) 方法中 width 和 height 参数的作用是什么? #75

Closed shortybin closed 7 years ago

shortybin commented 7 years ago
public class CustomImage extends View {

    Picture mPicture;

    private Canvas mCanvas;

    public CustomImage(Context context) {
        super(context);
    }

    public CustomImage(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        recording();

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //此处调用显示,仍然可以显示300的圆
        //mPicture.draw(canvas);

        //此处调用显示,仍然可以显示300的圆
        //canvas.drawPicture(mPicture);

        //此处调用显示,仍然可以显示300的圆
        //canvas.drawPicture(mPicture,new RectF(0,0,50,50));

        //此处调用显示,仍然可以显示300的圆
        //canvas.drawPicture(mPicture,new RectF(0,0,500,500));

        //此处调用显示,仍然可以显示300的圆
        //canvas.drawPicture(mPicture,new RectF(0,0,300,500));
    }

    private void recording(){
        mPicture=new Picture();
        //把width和height都设为0
        mCanvas = mPicture.beginRecording(0, 0);

        Paint paint=new Paint();
        paint.setColor(Color.BLACK);

        mCanvas.drawCircle(300,300,300,paint);

        mPicture.endRecording();

    }

}

上面width和weigth都设为0

public class CustomImage extends View {

    Picture mPicture;

    private Canvas mCanvas;

    public CustomImage(Context context) {
        super(context);
    }

    public CustomImage(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);

        recording();

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //此处调用显示,显示300的圆
        //mPicture.draw(canvas);

        //此处调用显示,显示300的圆
        //canvas.drawPicture(mPicture);

        //此处调用显示,显示50的圆
        //canvas.drawPicture(mPicture,new RectF(0,0,50,50));

        //此处调用显示,显示500的圆
        //canvas.drawPicture(mPicture,new RectF(0,0,500,500));

        //此处调用显示,显示宽度300,高度500的圆
        //canvas.drawPicture(mPicture,new RectF(0,0,300,500));
    }

    private void recording(){
        mPicture=new Picture();
        //把width和height都设为100
        mCanvas = mPicture.beginRecording(100, 100);

        Paint paint=new Paint();
        paint.setColor(Color.BLACK);

        mCanvas.drawCircle(300,300,300,paint);

        mPicture.endRecording();

    }

}

上面width和weigth都设为100

这两个值的作用不是很明白,求指点,谢谢!!!

GcsSloop commented 7 years ago

这两个值的含义的确是 Picture 的宽度和高度,在你的测试中,发现即便是录制内容超过这两个数值依旧会被绘制出来。估计是怀疑这两个数值到底有没有作用。

这两个数值是有作用的,简单举一个使用场景:

        // 将 Picture 宽高各缩放 0.5,缩放中心为 Picture 中心位置。
        canvas.save();
        canvas.scale(0.5f, 0.5f, mPicture.getWidth()/2, mPicture.getHeight()/2);
        canvas.drawPicture(mPicture);
        canvas.restore();

在这个例子中,getWidth 和 getHeight 所获取到的就是你在 beginRecording 时设置的数值,而不是 picture 的实际绘制区域大小。假如你设置的数值是 (100, 100) 则不论你的实际绘制区域为多大,缩放中心都是 (50, 50)

在你的例子中还有一个有趣的现象,那就是为 Picture 指定绘制区域(Rect)后,Picture 仍然能够显示完全,这是因为,指定绘制区域并不没有设置遮罩,仅仅是缩放了 picture 而已,所以实际绘制出来是一个大一点或者小一点的 picture。
缩放比例 = 实际大小/你设置的大小。
(假如你设置 beginRecording(0, 0),你会发现不论如何设置 Rect 的大小,Picture 实际绘制大小都不会改变,这是因为在数学中除数不能为0,所以无法计算出缩放比例导致的)

当然了,假如你后期变换并不依赖于 picture 的宽高数值,那么这两个数据对你的影响并不大,随便是任何数值都行。

尽管如此,还是建议在实际使用的时候为它设置一个合适的宽高,这样更加符合人们的直觉,在后期变换过程中也可以避免一些不必要的问题。

shortybin commented 7 years ago

讲解的很明白 在下受教了 多谢