难以理解的drawBitmap( Bitmap bitmap, Rect src, Rect dst, Paint paint)

/**
  绘制指定的位图,自动缩放/翻译以填充
*目标矩形。如果源矩形不是NULL,则
*指定要绘制的位图的子集。
*
* <BR>注意:如果涂料中含有maskfilter生成一个面具,
*超出位图的宽度/高度(如blurmaskfilter),
*然后绘制位图,就像它在一个带有夹子模式的着色器中一样。
因此,原来宽度/高度之外的颜色将是边缘。
*颜色复制。
*
<此函数<忽略与位图相关联的密度>。
*这是因为源和目标矩形坐标。
*空间是在各自的密度,所以必须已经有
*适用的比例因子。
     * @param bitmap The bitmap to be drawn
     * @param src    May be null. 这是位图的子集
     * @param dst    位图将被缩放/翻译的矩形。适合
     * @param paint  May be null. The paint used to draw the bitmap
     */
    public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull Rect dst,
            @Nullable Paint paint) {

从翻译来说是很难看懂的,

弄了一张宽700 高1026的图片,
若果直接700x1026绘制填写是无法显示全部的

实现下图的效果是非常不容易的.

Rect src=new Rect();
        src.top=0;
        src.right=1026/700*1080*2;
        src.left=0;
        src.bottom=1026/700*1920*2;

        Rect det=new Rect();//代表是从画布的哪里开始绘制,从哪里结束。这里右边为什么有一点点黄色的边框大家也应该明白了吧,
        det.top=0;
        det.right=1070;//见证右边的20px
        det.left=0;
        det.bottom=1800;

        canvas.drawBitmap(bitmapBg,src,det,paint);
        Bitmap bitmapSrc = BitmapFactory.decodeResource(getResources(), R.drawable.zheng2showzhengimg);

让一张图片700x1026的图片完整显示在1080x1920的手机上还真不容易.

image.png

再试试缩小图片为手机的1半看看
1080/1080/1920=607
缩小到自身的一半

具体代码

Rect src=new Rect();
        src.top=0;
        src.right=1026/700*1080*2;
        src.left=0;
        src.bottom=1026/700*1920*2;

        Rect det=new Rect();
        det.top=0;
        det.right=607;
        det.left=0;
        det.bottom=1080;
        paint.setColor(Color.RED);
        paint.setStrokeWidth(20);
        canvas.drawLine(0,det.bottom,det.right,det.bottom,paint);



        canvas.drawBitmap(bitmapBg,src,det,paint);
        Bitmap bitmapSrc = BitmapFactory.decodeResource(getResources(), R.drawable.zheng2showzhengimg);
image.png

可以看出来det参数代表图片永远无法超出它,而前者src 是图片比例的计算问题了,但是这里直接填写为图片的高宽会怎么呢?

Rect src=new Rect();
        src.top=0;
        src.right=700;
        src.left=0;
        src.bottom=1026;
        paint.setColor(Color.RED);
        paint.setStrokeWidth(20);
        canvas.drawLine(0,src.bottom,src.right,src.bottom,paint);



        canvas.drawBitmap(bitmapBg,src,src,paint);
        Bitmap bitmapSrc = BitmapFactory.decodeResource(getResources(), R.drawable.zheng2showzhengimg);

出现下图的效果,我的脑壳也不知道怎么运转了

image.png

,大概是图片必须必指定区域大,而且要大2倍以上才能完整显示图,不信?再试试吧

Rect src=new Rect();
        src.top=0;
        src.right=1080;
        src.left=0;
        src.bottom=1920;
        paint.setColor(Color.RED);
        paint.setStrokeWidth(20);
        canvas.drawLine(0,src.bottom,src.right,src.bottom,paint);
        canvas.drawBitmap(bitmapBg,src,src,paint);
        Bitmap bitmapSrc = BitmapFactory.decodeResource(getResources(), R.drawable.zheng2showzhengimg);

可谓你大我也大,可是原图实际上明明没那么大,为何需要控制src的大小超大才能显示完全呢??如下图虽然显示的区域更多了,可是给人的感觉就是图片的大小似乎超过1080x1920的大小,实际上并没有的,不存在的,那么是不是手机分辨率省电导致的? 这个我不信,和这没关系。这我会绘制的线条都正常显示的。

image.png

最后再来一把实验就结束本次研究,以后研究图片还是用缩放函数比较靠谱,这玩意网上也找不到什么方案,只知道要比dst大才能显示完全

已被玩坏,如今任何修改都不现实了。坑坑坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值