關(guān)于小米手機(jī)中bitmap圖片拼接黑邊問(wèn)題(截屏拼接二維碼分享)

需求是截屏 然后拼接上二維碼進(jìn)行分享操作。這里設(shè)計(jì)到的有截屏功能和拼接圖片功能葫掉。

  • 首先上截屏功能代碼:去除狀態(tài)欄后的 topHeight距離頂部高度 bottomHeight距離底部高度
    public static Bitmap screenShot(Activity activity, int topHeight, int bottomHeight) {

      // 獲取windows中最頂層的view
      View view = activity.getWindow().getDecorView();
      view.buildDrawingCache();
      // 獲取狀態(tài)欄高度
      Rect rect = new Rect();
      view.getWindowVisibleDisplayFrame(rect);
      int statusBarHeights = rect.top + topHeight;
      DisplayMetrics metric = new DisplayMetrics();
      activity.getWindowManager().getDefaultDisplay().getMetrics(metric);
      // 獲取屏幕寬和高
      int widths = metric.widthPixels;
      int heights = metric.heightPixels;
      // 允許當(dāng)前窗口保存緩存信息
      view.setDrawingCacheEnabled(true);
      // 去掉狀態(tài)欄
      Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarHeights, widths, heights - statusBarHeights - bottomHeight);
      // 銷毀緩存信息
      view.destroyDrawingCache();
      return bmp;
    

    }

很多反應(yīng)說(shuō)可能為null的情況 但是我是沒(méi)有碰到。

  • 第二步 把不在屏幕上的布局轉(zhuǎn)換成butmap
    1.把布局加載出來(lái)然后測(cè)量大小
    public static Bitmap createCodeBitmap(Activity context) {

      DisplayMetrics metric = new DisplayMetrics();
      context.getWindowManager().getDefaultDisplay().getMetrics(metric);
      int width = metric.widthPixels;
      View view = LayoutInflater.from(context).inflate(R.layout.item_share_k, null, false);
      LinearLayout ll = view.findViewById(R.id.itemShareK);
      layoutView(view, width, StringUtils.dip2px(context, 84f));
      return loadBitmapFromView(ll);
    

    }

2.把測(cè)量好的布局通過(guò)canvas畫布轉(zhuǎn)變成bitmap
public static Bitmap loadBitmapFromView(View v) {

    int w = v.getWidth();
    int h = v.getHeight();

    Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(bmp);

    c.drawColor(Color.WHITE);
    /** 如果不設(shè)置canvas畫布為白色留美,則生成透明 */

    v.layout(0, 0, w, h);
    v.draw(c);

    return bmp;
}
  • 第三部把兩個(gè)bitmap拼接
    1.網(wǎng)上已經(jīng)有很多資料了大多數(shù)都是根據(jù)長(zhǎng)寬竿音,使用新建一個(gè)bitmap
    Bitmap result = Bitmap.createBitmap(width, height, Config.ARGB_8888);
    方法來(lái)進(jìn)行橫向和豎向拼接來(lái)
    Canvas canvas = new Canvas(result);
    canvas.drawBitmap(first, 0, 0, null);
    canvas.drawBitmap(second, first.getHeight(), 0, null);
    一個(gè)新的bitmap
    2.這種方法對(duì)于大部分手機(jī)是可行的冯键,但是對(duì)于小米的劉海屏手機(jī)(mi 8)會(huì)出現(xiàn)右邊和下邊的邊框 具體原因不知 可能和小米獲取屏幕高度的時(shí)候是自動(dòng)去除掉底部操作欄的不知道是處于什么考慮 后來(lái)經(jīng)過(guò)一番查找 找到了另外一種設(shè)置bitmap的方法成功適配
    /**
    • 把兩個(gè)位圖覆蓋合成為一個(gè)位圖菲语,上下拼接
    • @param isBaseMax 是否以高度大的位圖為準(zhǔn)妄辩,true則小圖等比拉伸,false則大圖等比壓縮
    • @return
      */
      public static Bitmap composeCodeBitmap(Bitmap topBitmap, Bitmap bottomBitmap, boolean isBaseMax) {
    if (topBitmap == null || topBitmap.isRecycled()
            || bottomBitmap == null || bottomBitmap.isRecycled()) {
        return null;
    }
    int width = 0;
    if (isBaseMax) {
        width = topBitmap.getWidth() > bottomBitmap.getWidth() ? topBitmap.getWidth() : bottomBitmap.getWidth();
    } else {
        width = topBitmap.getWidth() < bottomBitmap.getWidth() ? topBitmap.getWidth() : bottomBitmap.getWidth();
    }
    Bitmap tempBitmapT = topBitmap;
    Bitmap tempBitmapB = bottomBitmap;

    if (topBitmap.getWidth() != width) {
        tempBitmapT = Bitmap.createScaledBitmap(topBitmap, width, (int) (topBitmap.getHeight() * 1f / topBitmap.getWidth() * width), false);
    } else if (bottomBitmap.getWidth() != width) {
        tempBitmapB = Bitmap.createScaledBitmap(bottomBitmap, width, (int) (bottomBitmap.getHeight() * 1f / bottomBitmap.getWidth() * width), false);
    }

    int height = tempBitmapT.getHeight() + tempBitmapB.getHeight();

    Bitmap bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);

    Rect topRect = new Rect(0, 0, tempBitmapT.getWidth(), tempBitmapT.getHeight());
    Rect bottomRect = new Rect(0, 0, tempBitmapB.getWidth(), tempBitmapB.getHeight());

    Rect bottomRectT = new Rect(0, tempBitmapT.getHeight(), width, height);

    canvas.drawBitmap(tempBitmapT, topRect, topRect, null);
    canvas.drawBitmap(tempBitmapB, bottomRect, bottomRectT, null);
    return bitmap;
}

通過(guò)Rect來(lái)確定區(qū)域 然后再來(lái)生成bitmap適配

至此記錄I缴稀Q垡!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末佩憾,一起剝皮案震驚了整個(gè)濱河市哮伟,隨后出現(xiàn)的幾起案子干花,更是在濱河造成了極大的恐慌,老刑警劉巖楞黄,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件池凄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谅辣,警方通過(guò)查閱死者的電腦和手機(jī)修赞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門婶恼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)桑阶,“玉大人,你說(shuō)我怎么就攤上這事勾邦◎悸迹” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵眷篇,是天一觀的道長(zhǎng)萎河。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蕉饼,這世上最難降的妖魔是什么虐杯? 我笑而不...
    開(kāi)封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮昧港,結(jié)果婚禮上擎椰,老公的妹妹穿的比我還像新娘。我一直安慰自己创肥,他們只是感情好达舒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著叹侄,像睡著了一般巩搏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趾代,一...
    開(kāi)封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天贯底,我揣著相機(jī)與錄音,去河邊找鬼撒强。 笑死禽捆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尿褪。 我是一名探鬼主播睦擂,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杖玲!你這毒婦竟也來(lái)了顿仇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臼闻,沒(méi)想到半個(gè)月后鸿吆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡述呐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年惩淳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乓搬。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡思犁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出进肯,到底是詐尸還是另有隱情激蹲,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布江掩,位于F島的核電站学辱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏环形。R本人自食惡果不足惜策泣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抬吟。 院中可真熱鬧萨咕,春花似錦、人聲如沸拗军。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)发侵。三九已至交掏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刃鳄,已是汗流浹背盅弛。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叔锐,地道東北人挪鹏。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像愉烙,于是被迫代替她去往敵國(guó)和親讨盒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容