难以理解的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大才能显示完全

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,709评论 1 180
  • 本文参考自: Google的官方权威适配文档 郭霖:Android官方提供的支持不同屏幕大小的全部方法 Storm...
    M悇芐冋忆阅读 12,993评论 5 56
  • 似有似无,若即若离,缘是世上最难解的谜团。以为你离我远去,却看见了你的眼泪;以为你近在身旁,却看不见你的模...
    冰夫阅读 136评论 0 0
  • 将多个纹理组合起来映射到一个单一纹理,立方体贴图含有6个2D纹理对应每个面。 特点:立方体贴图可使用方向向量对其索...
    龙遁流阅读 1,130评论 0 1
  • ♥ 桃小姐喜欢听歌,尤其喜欢听歌词有内涵的,曾经听Eason的《葡萄成熟时》有一句歌词,深深触动了我——日后...
    桃成蹊小姐阅读 517评论 0 0