圖片不拉伸、不改變view大小的前提下谎懦,解決空白問題

空白問題:
image.png

對于這個(gè)情況肚豺,第一時(shí)間想到的方法,就是imageview增加scaleType="centerCrop"界拦。
imageview自帶的centerCrop是不管圖片小于還是大于imageview的大小吸申,都會等比例拉伸填充滿,然后裁剪享甸;

另外截碴,如果圖片加載框使用的是glide,那么glide自己也有一個(gè)centerCrop蛉威,但是跟imageview自帶的不一樣隐岛。
Glide的centerCrop對于大圖是裁剪,如果圖片小于imageview瓷翻,則是等比例全部顯示在imageview里而不是填滿裁剪;

注意:如果imageview自己設(shè)置了centeCrop,這時(shí)候Glide再設(shè)置圓角割坠,如果圖片原圖小于imageview齐帚,圓角是無效的。
這是因?yàn)間lide先處理了圖片數(shù)據(jù)彼哼,同時(shí)由于圖片是小于imageview的大小的对妄,所以glide的處理是全部顯示在imageview上,然后處理圓角敢朱。最后把處理完的圖片數(shù)據(jù)(有圓角)剪菱,設(shè)置在imageview上,由于imageview有centerCrop屬性拴签,圖片會等比例拉伸填充裁剪孝常,導(dǎo)致了圓角的失效。

imageview同時(shí)設(shè)置fitXY 和adjustViewBounds 也能達(dá)到效果蚓哩。
fitXY 這種圖片的顯示方式的效果是:根據(jù) ImageView 設(shè)置的大小拉伸圖片以填充滿空間构灸,(單獨(dú)設(shè)置此屬性時(shí))圖片會變形。
adjustViewBounds 是限制圖片在顯示時(shí)保持原圖比例岸梨。(和 fitXY 顯示方式合用能到達(dá)自適應(yīng)的效果)

不使用Android自帶屬性喜颁,怎么達(dá)到一樣的效果稠氮?

①自定義view,繼承iamgeview半开,重寫onMeasure

@SuppressLint("AppCompatCustomView")
public class ResizableImageView extends ImageView {

    private int value=0;

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

    public ResizableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
        Drawable d = getDrawable();
        if(d!=null){
            int width = MeasureSpec.getSize(widthMeasureSpec);
            int height = width;
            //高度根據(jù)使得圖片的寬度充滿屏幕計(jì)算而得(這個(gè)是默認(rèn)計(jì)算)
            //  int height = (int) Math.ceil((float) width * (float) d.getIntrinsicHeight() / (float) d.getIntrinsicWidth());
            if (value==1){
                 height = (int) Math.ceil((float) (width*4/3));
            }
            setMeasuredDimension(width, height);
        }else{
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    //根據(jù)傳過來的值隔披,1是寬度3:4,其它值是1:1
    public void  setMeasure(int value){
        this.value= value;
    }
}

但是如果利用glide來加載圖片寂拆,又會發(fā)現(xiàn)奢米,上面的方法也是不行的,因?yàn)間lide是根據(jù)imageview的大小來加載的漓库,由于上面設(shè)置的是warp_content恃慧,所以glide無法準(zhǔn)確根據(jù)大小來加載圖片。

解決方法:
1渺蒿、你已經(jīng)知道圖片(或其他方式提前知道)圖片的比例痢士,然后在用 Glide 請求圖片時(shí)限制圖片的加載大小,即設(shè)置 override(int width, int height) 茂装。這時(shí)候加載到的圖片是原圖比例怠蹂,顯示的時(shí)候雖然有拉伸/壓縮但都會保存原比例的。這種方式適用于你加載的圖片大小都比較規(guī)范固定的時(shí)候少态。

2城侧、當(dāng)你請求的圖片源大小不一定一致。那這時(shí)候就可以使用下面這種方式了彼妻。這種方式的原理是嫌佑,先使用 Glide 把圖片的原圖請求加載過來,然后再按原圖來顯示圖片侨歉。

    Glide.with(mContext)
    .load(url)
    .asBitmap()
    .into(new SimpleTarget<Bitmap>() {
    @Override
    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
    ivOcnyang.setImageBitmap(resource);
    }
    });

這兩種方法中屋摇,其實(shí)更加提倡的是第一種方式,因?yàn)檫@種方式不會造成任何負(fù)面的影響幽邓。但第二種方式炮温,由于Glide加載圖片時(shí)是以全分辨率加載的,當(dāng)加載圖片過大且圖片很多時(shí)牵舵,可能造成 OOM柒啤。同時(shí)第二種方式使用在列表上復(fù)用時(shí)會造成條目錯(cuò)亂錯(cuò)位。

但是我們要圖片不拉伸畸颅,view大小也不改變担巩,將空白解決。

其實(shí)也簡單没炒,也是需要自定義view兵睛。
①自定義view,重寫ondraw方法。
②獲得將要顯示的圖片的尺寸或者比例祖很,傳入自定義view中笛丙,備用。
③onMeasure可以獲得控件的大小假颇,記錄下來胚鸯。
④在ondraw方法里,根據(jù)控件的大小和圖片的大小笨鸡,利用canvas先把圖片從左上角開始填充姜钳。
⑤記錄填充后的位置,如果還小于控件的大小形耗,那就繼續(xù)接著填充同樣的圖片bitmap哥桥,直到填滿為止。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末激涤,一起剝皮案震驚了整個(gè)濱河市拟糕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倦踢,老刑警劉巖送滞,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辱挥,居然都是意外死亡犁嗅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門晤碘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褂微,“玉大人,你說我怎么就攤上這事园爷〕杪欤” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵腮介,是天一觀的道長。 經(jīng)常有香客問我端衰,道長叠洗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任旅东,我火速辦了婚禮灭抑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抵代。我一直安慰自己腾节,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著案腺,像睡著了一般庆冕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劈榨,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天访递,我揣著相機(jī)與錄音,去河邊找鬼同辣。 笑死拷姿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旱函。 我是一名探鬼主播响巢,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棒妨!你這毒婦竟也來了踪古?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤靶衍,失蹤者是張志新(化名)和其女友劉穎灾炭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颅眶,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜈出,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涛酗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铡原。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖商叹,靈堂內(nèi)的尸體忽然破棺而出燕刻,到底是詐尸還是另有隱情,我是刑警寧澤剖笙,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布卵洗,位于F島的核電站,受9級特大地震影響弥咪,放射性物質(zhì)發(fā)生泄漏过蹂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一聚至、第九天 我趴在偏房一處隱蔽的房頂上張望酷勺。 院中可真熱鬧,春花似錦扳躬、人聲如沸脆诉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骚揍。三九已至,卻和暖如春啰挪,著一層夾襖步出監(jiān)牢的瞬間信不,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工亡呵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抽活,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓锰什,卻偏偏與公主長得像下硕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子汁胆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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