Android 一個(gè)Imageview加載長(zhǎng)圖

有些APP可能為了省事和界面美觀會(huì)把很多內(nèi)容做成一張高清圖片交給移動(dòng)端去加載(我們的項(xiàng)目就是...),如果圖片較小那還OK衍菱,但是如果圖片過(guò)大(我們的有2M還多,MMP)要么不顯示爷狈,要么非常模糊拯辙。那我們應(yīng)該怎么辦呢?用BitmapRegionDecoder將圖片進(jìn)行切分然后再進(jìn)行拼接就可以了企垦。


大圖展示.gif

以本文圖片為例环壤,高是6543,以3000為單位進(jìn)行切分钞诡,那么要生成2個(gè)3000的加上1個(gè)543的bitmap

String url = "http://bmob-cdn-15177.b0.upaiyun.com/2018/08/23/8fa7f1c2404bafbd808bde10ff072ceb.jpg";
Glide.with(this).load(url)
                .asBitmap()
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                        setBitmapToImg(resource);
                    }
                });

private void setBitmapToImg(Bitmap resource) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            resource.compress(Bitmap.CompressFormat.PNG, 100, baos);

            InputStream isBm = new ByteArrayInputStream(baos.toByteArray());

            //BitmapRegionDecoder newInstance(InputStream is, boolean isShareable)
            //用于創(chuàng)建BitmapRegionDecoder郑现,isBm表示輸入流,只有jpeg和png圖片才支持這種方式荧降,
            // isShareable如果為true接箫,那BitmapRegionDecoder會(huì)對(duì)輸入流保持一個(gè)表面的引用,
            // 如果為false朵诫,那么它將會(huì)創(chuàng)建一個(gè)輸入流的復(fù)制辛友,并且一直使用它。即使為true剪返,程序也有可能會(huì)創(chuàng)建一個(gè)輸入流的深度復(fù)制废累。
            // 如果圖片是逐步解碼的,那么為true會(huì)降低圖片的解碼速度脱盲。如果路徑下的圖片不是支持的格式邑滨,那就會(huì)拋出異常
            BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(isBm, true);

            final int imgWidth = decoder.getWidth();
            final int imgHeight = decoder.getHeight();

            BitmapFactory.Options opts = new BitmapFactory.Options();

            //計(jì)算圖片要被切分成幾個(gè)整塊,
            // 如果sum=0 說(shuō)明圖片的長(zhǎng)度不足3000px钱反,不進(jìn)行切分 直接添加
            // 如果sum>0 先添加整圖驼修,再添加多余的部分殿遂,否則多余的部分不足3000時(shí)底部會(huì)有空白
            int sum = imgHeight/3000;

            int redundant = imgHeight%3000;

            List<Bitmap> bitmapList = new ArrayList<>();

            //說(shuō)明圖片的長(zhǎng)度 < 3000
            if (sum == 0){
                //直接加載
                bitmapList.add(resource);
            }else {
                //說(shuō)明需要切分圖片
                for (int i = 0; i < sum; i++) {
                    //需要注意:mRect.set(left, top, right, bottom)的第四個(gè)參數(shù),
                    //也就是圖片的高不能大于這里的4096
                    mRect.set(0, i*3000, imgWidth, (i+1) * 3000);
                    Bitmap bm = decoder.decodeRegion(mRect, opts);
                    bitmapList.add(bm);
                }

                //將多余的不足3000的部分作為尾部拼接
                if (redundant > 0){
                    mRect.set(0, sum*3000, imgWidth, imgHeight);
                    Bitmap bm = decoder.decodeRegion(mRect, opts);
                    bitmapList.add(bm);
                }

            }

            Bitmap bigbitmap = Bitmap.createBitmap(imgWidth, imgHeight, Bitmap.Config.ARGB_8888);
            Canvas bigcanvas = new Canvas(bigbitmap);

            Paint paint = new Paint();
            int iHeight = 0;

            //將之前的bitmap取出來(lái)拼接成一個(gè)bitmap
            for (int i = 0; i < bitmapList.size(); i++) {
                Bitmap bmp = bitmapList.get(i);
                bigcanvas.drawBitmap(bmp, 0, iHeight, paint);
                iHeight += bmp.getHeight();

                bmp.recycle();
                bmp = null;
            }

            mImageView1.setImageBitmap(bigbitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

布局文件

<ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
            <ImageView
                android:id="@+id/iv_big"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"
                android:scaleType="fitXY"/>
</ScrollView>

需要注意:mRect.set(left, top, right, bottom)的第四個(gè)參數(shù)乙各, 不能大于4096墨礁,最后盡量把圖片壓縮下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市耳峦,隨后出現(xiàn)的幾起案子恩静,更是在濱河造成了極大的恐慌,老刑警劉巖蹲坷,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驶乾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡循签,警方通過(guò)查閱死者的電腦和手機(jī)级乐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)县匠,“玉大人风科,你說(shuō)我怎么就攤上這事∑虻” “怎么了贼穆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兰粉。 經(jīng)常有香客問(wèn)我故痊,道長(zhǎng),這世上最難降的妖魔是什么玖姑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任愕秫,我火速辦了婚禮,結(jié)果婚禮上焰络,老公的妹妹穿的比我還像新娘戴甩。我一直安慰自己,他們只是感情好舔琅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布等恐。 她就那樣靜靜地躺著,像睡著了一般备蚓。 火紅的嫁衣襯著肌膚如雪课蔬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天郊尝,我揣著相機(jī)與錄音二跋,去河邊找鬼。 笑死流昏,一個(gè)胖子當(dāng)著我的面吹牛扎即,可吹牛的內(nèi)容都是我干的吞获。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谚鄙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼各拷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闷营,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烤黍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后傻盟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體速蕊,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年娘赴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了规哲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诽表,死狀恐怖唉锌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情关顷,我是刑警寧澤糊秆,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布武福,位于F島的核電站议双,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏捉片。R本人自食惡果不足惜平痰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伍纫。 院中可真熱鬧宗雇,春花似錦、人聲如沸莹规。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)良漱。三九已至舞虱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間母市,已是汗流浹背矾兜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留患久,地道東北人椅寺。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓浑槽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親返帕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桐玻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 一直以來(lái)Bitmap在Android中的處理都是非常棘手的。如果我們直接將一個(gè)完整分辨率的圖片加載到內(nèi)存中它會(huì)占用...
    godliness閱讀 1,684評(píng)論 0 13
  • Android系統(tǒng)對(duì)加載圖片做了一些限制荆萤,其中一個(gè)就是對(duì)Bitmap有最大寬高限制畸冲,某些系統(tǒng)的機(jī)子的限制不一樣,但...
    EmanLu閱讀 9,961評(píng)論 0 12
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評(píng)論 25 707
  • 關(guān)于網(wǎng)絡(luò)加載已經(jīng)寫(xiě)完了观腊,今天來(lái)給大家分享一下關(guān)于圖像加載的知識(shí)邑闲,在開(kāi)發(fā)中除了請(qǐng)求數(shù)據(jù)怎么顯示之外,剩下的 最...
    deyson閱讀 898評(píng)論 0 3
  • 別人的總結(jié)不一定適合自己梧油,所以盡量多做一些自己的總結(jié)苫耸,針對(duì)自己的薄弱點(diǎn)重點(diǎn)說(shuō)明,適當(dāng)?shù)慕梃b別人儡陨,少走一些彎路褪子。最重...
    renkuo閱讀 7,405評(píng)論 2 48