6.3 Android中的Drawable

8. ScaleDrawable

ScaleDrawable對(duì)應(yīng)于<scale>標(biāo)簽,它可以根據(jù)自己的等級(jí)將指定的Drawable縮放到一定比例票髓。

Amy_LuLu__的圖

<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/drawable_resource"
    android:scaleGravity=["top" | "bottom" | "left" | "right" | 
    "center_vertical" | "fill_vertical" | "center_horizontal" | 
    "fill_horizontal" | "center" | "fill" | "clip_vertical" | 
    "clip_horizontal"]
    android:scaleHeight="percentage"
    android:scaleWidth="percentage" />
  • android:scaleGravity: 縮放的方向, 比如: top, 縮放的時(shí)候就會(huì)向頂部靠攏,bottom, 縮放時(shí)會(huì)向底部靠攏;
  • android:scaleHeight: 表示Drawable能夠在高度上縮放的百分比, 比如: 50%,
  • android:scaleWidth: 表示Drawable能夠在寬度上縮放的百分比, 同上;

ScaleDrawable的縮放,并不是自動(dòng)的建立在原有Drawable尺寸的基礎(chǔ)上的笼吟。而是咐鹤,需要給原有的Drawable指定一個(gè)Level,然后ScaleDrawable是在這個(gè)Level的基礎(chǔ)上進(jìn)行縮放的G群恕谓传!

更加坑爹的事情是,在設(shè)置百分比的時(shí)候芹关,設(shè)置的值是縮小的比例续挟。也就是說(shuō),設(shè)置0.1侥衬,意為縮小10%J觥!而不是原始大小的10%V嶙堋直颅!

ScaleDrawable不能單獨(dú)的使用, 他需要配合Level等級(jí)使用, level的取值是0~10000, (0為不可見(jiàn))

<?xml version="1.0" encoding="utf-8"?>
<scale
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@android:color/holo_green_dark"
    android:scaleGravity="left"
    android:scaleWidth="30%"
    android:scaleHeight="30%">

</scale>

作為背景使用

<TextView
    android:id="@+id/tv"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:text="Hello World!"
    android:gravity="center"
    android:clickable="true"
    android:background="@drawable/scale_drawable"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

在Java中使用

tv = findViewById(R.id.tv);
final ScaleDrawable scaleDrawable = (ScaleDrawable) tv.getBackground();
scaleDrawable.setLevel(0); // 不顯示

tv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        scaleDrawable.setLevel(5000);
    }
});

先來(lái)理清下View的寬高, Drawable的寬高, 可縮放的百分比,Level等級(jí)三者間的關(guān)系: 一個(gè)個(gè)來(lái)說(shuō):

  • View的寬高: 在整個(gè)過(guò)程中是不會(huì)發(fā)生變化的;
  • 可縮放的百分比: 先搞清楚這個(gè)百分比, 它是控件能夠縮小的最小尺寸, 比如:10%, 表示Drawable最小能縮小到控件的10%寬或者高, 這時(shí)候還需要加上一個(gè)level等級(jí)
  • Level等級(jí):取值是0~10000; 上面Drawable能放大或縮小的區(qū)間是10%~100%, 這個(gè)區(qū)間就是用0~10000是描述. 它們和縮放后的寬高存在一個(gè)等式:
縮放后的寬高 = Drawable顯示的寬高(大多時(shí)候是View的寬高) - Drawable顯示的寬高(大多時(shí)候是View的寬高) * 可縮放的百分比 * (設(shè)置的Level/10000);

9. ClipDrawable


ClipDrawable對(duì)應(yīng)于<clip>標(biāo)簽,它可以根據(jù)自己當(dāng)前的等級(jí)(level)來(lái)裁剪另一個(gè)Drawable怀樟,裁剪方向可以通過(guò)android:clipOrientationandroid:gravity這兩個(gè)屬性來(lái)共同控制功偿。
其中clipOrientation表示裁剪方向,有水平和豎直兩個(gè)方向往堡,gravity比較復(fù)雜械荷,需要和clipOrientation一起才能發(fā)揮作用。
gravity屬性

在XML中設(shè)置

<?xml version="1.0" encoding="utf-8"?>
<clip
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/circle"
    android:clipOrientation="vertical"
    android:gravity="bottom">

</clip>

在布局中使用

<ImageView
    android:id="@+id/imageView"
    android:layout_width="384dp"
    android:layout_height="511dp"
    android:src="@drawable/drawable_clip"/>

在Java中使用

imageView = findViewById(R.id.imageView);
clipDrawable = (ClipDrawable) imageView.getDrawable();
clipDrawable.setLevel(5000);

Drawable的等級(jí)(level)是有范圍的虑灰,即0~10000吨瞎,最小等級(jí)是0,最大等級(jí)是10000穆咐,對(duì)于ClipDrawable來(lái)說(shuō)颤诀,等級(jí)0表示完全裁剪字旭,即整個(gè)Drawable都不可見(jiàn)了,而等級(jí)10000表示不裁剪崖叫。在上面的代碼中遗淳,將等級(jí)設(shè)置為8000,表示裁剪了2000心傀,即在底部裁減掉20%的區(qū)域洲脂,被裁減的區(qū)域就相當(dāng)于不存在了。

等級(jí)越大剧包,表示裁剪的區(qū)域越小恐锦,因此等級(jí)10000表示不裁剪,這個(gè)時(shí)候整個(gè)圖片都可以完全顯示出來(lái)疆液;而等級(jí)0則表示裁剪全部區(qū)域一铅,這個(gè)時(shí)候整個(gè)圖片將不可見(jiàn)。另外裁剪效果還受裁剪方向和gravity屬性的影響堕油。

10. 自定義Drawable

Drawable的使用范圍很單一潘飘,一個(gè)是作為ImageView中的圖像來(lái)顯示,另外一個(gè)就是作為View的背景掉缺,大多數(shù)情況下Drawable都是以View的背景這種形式出現(xiàn)的卜录。

通常我們沒(méi)有必要去自定義 Drawable,這是因?yàn)樽远x的Drawable無(wú)法在XML中使用眶明,這就降低了Drawable的使用范圍艰毒。

public class CustomDrawable extends Drawable{

    private Paint mPaint;

    public CustomDrawable(int color) {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(color);
    }


    @Override
    public void draw(@NonNull Canvas canvas) {
        final Rect rect = getBounds();
        float cx = rect.exactCenterX();
        float cy = rect.exactCenterY();
        canvas.drawCircle(cx,cy,Math.min(cx,cy),mPaint);
    }

    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
        invalidateSelf();
    }

    @Override
    public void setColorFilter(@Nullable ColorFilter colorFilter) {
        mPaint.setColorFilter(colorFilter);
        invalidateSelf();
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}

在Java中

imageView2 = findViewById(R.id.imageView2);
CustomDrawable drawable = new CustomDrawable(R.color.colorPrimary);
imageView2.setImageDrawable(drawable);
借用開(kāi)心wonderful的圖

getIntrinsicWidthgetIntrinsicHeight這兩個(gè)方法需要注意一下,當(dāng)自定義的Drawable有固定大小時(shí)最好重寫(xiě)這兩個(gè)方法搜囱,因?yàn)樗鼤?huì)影響到Viewwrap_content布局丑瞧。
Drawable的實(shí)際大小可以通過(guò)它的getBounds方法來(lái)得到。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜀肘,一起剝皮案震驚了整個(gè)濱河市绊汹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扮宠,老刑警劉巖西乖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異坛增,居然都是意外死亡获雕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門轿偎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)典鸡,“玉大人被廓,你說(shuō)我怎么就攤上這事坏晦。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵昆婿,是天一觀的道長(zhǎng)球碉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)仓蛆,這世上最難降的妖魔是什么睁冬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮看疙,結(jié)果婚禮上豆拨,老公的妹妹穿的比我還像新娘。我一直安慰自己能庆,他們只是感情好施禾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著搁胆,像睡著了一般弥搞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渠旁,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天攀例,我揣著相機(jī)與錄音,去河邊找鬼顾腊。 笑死粤铭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杂靶。 我是一名探鬼主播承耿,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伪煤!你這毒婦竟也來(lái)了加袋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抱既,失蹤者是張志新(化名)和其女友劉穎职烧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體防泵,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚀之,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捷泞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片足删。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锁右,靈堂內(nèi)的尸體忽然破棺而出失受,到底是詐尸還是另有隱情讶泰,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布拂到,位于F島的核電站痪署,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兄旬。R本人自食惡果不足惜狼犯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望领铐。 院中可真熱鬧悯森,春花似錦、人聲如沸绪撵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)莲兢。三九已至汹来,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間改艇,已是汗流浹背收班。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谒兄,地道東北人摔桦。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像承疲,于是被迫代替她去往敵國(guó)和親邻耕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,187評(píng)論 25 707
  • 前言 本文是本人閱讀《Android開(kāi)發(fā)藝術(shù)探索》的第6章《Android的Drawable》后的總結(jié)筆記燕鸽。包含了...
    daking閱讀 5,322評(píng)論 2 29
  • 一兄世、 Drawable簡(jiǎn)介 1 Drawable表示的是一種可以在Canvas上進(jìn)行繪制的抽象的概念,可以是純顏色...
    黃海佳閱讀 1,212評(píng)論 0 10
  • 看到微信的的時(shí)候,我簡(jiǎn)直不敢相信自己的眼睛党远。 “告訴你個(gè)好消息削解,我決定去青海支教了」涤椋” 其實(shí)我第一想到的是氛驮,艱苦的...
    鹿浪漫閱讀 6,706評(píng)論 0 0
  • 穿著最愛(ài)的百事小內(nèi)褲 披著黑色羽絨服 站在陽(yáng)臺(tái)上,靠著欄桿 嘴里是蛋明給的济似,用插在在書(shū)館的某本小說(shuō)里的一百塊錢買的...
    蘇銳叔叔閱讀 308評(píng)論 0 3