ImageView之ScaleType詳解及拓展

2021-09-11 10:16:19 字數 2289 閱讀 7042

imageview中有個很重要也很常用的屬性android:scaletype,相信大家都應該不陌生,主要用於控制在imageview中顯示的樣式,比如顯示大小、顯示位置、顯示內容區域。當然也可以在**中設定:setscaletype(imageview.scaletype.***);scaletype的取值一共有8種:fitcenterfitendcentercentercropcenterinsidematrixfitxyfitstart。其中預設值是fitcenter。 我們先來看比較簡單的center吧,乙個60dp*40dp的imageview(為了顯示效果,背景設成藍色)裡面放了張20dp*20dp的。上圖看看效果:

center的含義是:保持原圖的大小,顯示在imageview的中心。當原圖的size大於imageview的size,超過部分裁剪處理。 再來看比較「暴力」的fitxy

嗯,接下來我們...什麼?難道你以為我要把剩下的6種樣式都貼張圖出來,然後愉快地水一篇部落格嗎?

所以接下來我放大招了,開始分析原始碼!

上面設定了這麼多種scaletype,那麼最終生效的位置在哪呢?答案就在configurebounds()方法裡,限於篇幅我貼了上面兩種樣式的法,其他的樣式實現也都類似。

private

void

configurebounds

() else else

} if (scaletype.center == mscaletype)

複製**

可以看到最終的實現用到了drawable類和matrix類的方法。前者大家都很熟悉,就是我們設定的要顯示的,而matrix叫做矩陣,是乙個專門用來處理圖形變換中的重要工具類,熟悉自定義view的同學應該對它不陌生,canvas.setmatrix(matrix)可以做出很多獨特效果來。而我們今天的主角是imageview,所以沒錯imageview也有這個方法:

imageview.setimagematrix(matrix)

通過上述方法我們就能將自己定義的matrix應用到imageview中。可以看到原始碼,要使這個方法生效,scaletype一定要設為matrix,不然執行完自己的變換後還是會執行樣式自己的變換,相當於沒執行。

fit_xy的實現很簡單,就用到了setbounds(int left, int top, int right, int bottom),這個四引數指的是drawable的繪製區域。center用到了posttranslate(float dx, float dy),將drawable移到imageview中間,因為沒有其他處理,如果比imageview大,那麼多餘的區域就會被裁剪掉,不顯示了。

int m = 20;

//平移

private

void

onclick

(view v)

複製**

來看看效果:

通過改變posttranslate引數的值我們就能改變在view中繪製的起始位置。 當然不會這麼簡單。matrix還有其他方法:postrotate(float degrees, float px, float py)//旋** 我們仿照center的處理將移到imageview中心,然後進行旋**

int m = 20;

//旋轉

private

void

onclick

(view v)

複製**

看看效果:

說了這麼多,這篇文章就是給大家介紹了android:scaletype的自定義用法,當遇到imageview預設的顯示模式不能滿足我們現有需求的時候(比如我就遇到原圖按照原來的大小居底部顯示,如果原圖的大小超過了imageview的大小,那麼就剪裁掉多餘部分,保留底部,和centercrop裁剪四周有所不同),我們就可以動態設定自己的matrix來自定義顯示效果。當然如果你經常要用到這種方式的時候,可以繼承imageview,封裝這些自定義樣式。

Tkinter 之Scale滑塊標籤

一 引數說明 語法作用 scale window,label 滑塊 滑塊標題 scale window,label 滑塊 from 0 滑塊最小值為0 scale window,label 滑塊 to 100 滑塊最大值為100 scale window,label 滑塊 length 200 滑塊...

Caffe之Scale層原始碼

最近要對模型進行壓縮使用slimming,因此需要scale層對scale diff進行l1正則。所以對原始碼進行了閱讀。公式 y ax b。公式比較簡單。上述公式的意思是,對feature map乘以a,並加b。乙個feature map共用乙個a,因此 a的維度是 c 這是理解原始碼的前提。反向...

iTween基礎之Scale(縮放大小)

一 基礎介紹 scaleto 改變遊戲物件的比例大小到提供的值。scalefrom 將物體的大小從提供的值變化到原來的大小 scaleadd 增加遊戲物體的大小。scaleby 成倍改變物體大小。amount引數為倍數。scaleupdate 類似於scaleto 在update 方法或迴圈環境中呼...