概述
Skin類是一個容器,可以存儲UI widgets需要用到的資源:TextureRegions, ninepatches, fonts, colors等。Skin也提供很方便的轉換,比如以ninepatch, sprite或者drawable的方式來獲取texture region.
這里的Skin 文件可以用來作為一個開始點。你需要uiskin.png,uiskin.atlas, uiskin.json 和 default.fnt. 你可以快速的開始使用scene2d.ui和改換這些皮膚資源。
典型的Skin資源可以來自texture atlas,Widget style,其它用JSON定義的對象,和用代碼加入到skin的對象。即使沒有用JSON,我們還是推薦使用texture atlas的skin和通過代碼添加的對象。這樣會更容易的獲取drawables的實例和集中獲取UI資源。
有用的資源:
- Ready to use skins.
-
Skin Composer
is a UI tool for creating and editing skins. - Basic skin Label tutorial
資源
Skin里面的每個資源的都有一個名字,一個類型。從TextureAtlas可以作為資源添加進入Skin。TextureAtlas中的TextureRegion可以被獲取并轉換為 ninepatch, sprite, tiled drawable 或者drawable的類型。
TextureAtlas atlas = ...
Skin skin = new Skin();
skin.addRegions(atlas);
...
TextureRegion hero = skin.get("hero", TextureRegion.class);
Skin的資源也可以用JSON來定義,或者通過代碼增加
Skin skin = new Skin();
skin.add("logo", new Texture("logo.png"));
...
Texture logo = skin.get("logo", Texture.class);
快捷的方法用來獲取Skin中的資源
有一些很快捷的get方法用來索引常見的類型
Skin skin = ...
Color red = skin.getColor("red");
BitmapFont font = skin.getFont("large");
TextureRegion region = skin.getRegion("hero");
NinePatch patch = skin.getPatch("header");
Sprite sprite = skin.getSprite("footer");
TiledDrawable tiled = skin.getTiledDrawable("pattern");
Drawable drawable = skin.getDrawable("enemy");
轉換
當需要使用圖片的時候,UI widgets的所有styles都使用Drawable 。
在UI的任何位置都可以使用texture region, ninepatch, sprite等等。
Skin使得 textures/textureregion轉換為drawables和其他類型都非常容易。 從texture轉換為各種類型。
Skin skin = new Skin();
skin.add("logo", new Texture("logo.png"));
...
Texture texture = skin.get("logo", Texture.class);
TextureRegion region = skin.getRegion("logo");
NinePatch patch = skin.getPatch("logo");
Sprite sprite = skin.getSprite("logo");
TiledDrawable tiled = skin.getTiledDrawable("logo");
Drawable drawable = skin.getDrawable("logo");
一個textureregion可以被獲取并轉換為一個ninepatch, sprite, tiled drawable或者drawable。第一次換轉時將創(chuàng)建一個新的對象并保存在Skin。后面的獲取時則返回這個存儲的對象。
在獲取和轉換為drawable的時候,Skin會選擇最適合的drawable類型. 如果這個region是一個包含ninepatch split信息的AtlasRegion,就會返回一個NinePatchDrawable。如果該region是一個已經旋轉或空白區(qū)域的AtlasRegion,那么將返回SpriteDrawable。其他情況下,將返回TextureRegionDrawable.
修改資源
從Skin中獲取的資源時時獲取對象的索引。如果對象被修改了,那么這個改變會反映到整個應用程序。如果這不是你期望的結果,那么需要制作一個對象的副本。
newDrawable方法會復制一個drawable. 新的drawable對象的size信息可以改變且不影響原對象。該方法還可以繪制一個drawable。
Skin skin = ...
...
Drawable redDrawable = skin.newDrawable("whiteRegion", Color.RED);
注意:新的drawable不會自動的存儲在Skin中。為了將它存儲進入Skin,必須和其他的一樣,顯示的添加進去。
Widget styles
Skin是一個好用的容器,用來給UI widget提供需要的texture region和其他的資源。 Skin也可以用來定義UI widgets的style, style用來表示widgets的外觀。
TextButtonStyle buttonStyle = skin.get("bigButton", TextButtonStyle.class);
TextButton button = new TextButton("Click me!", buttonStyle);
所有的widgets都有快捷的方法用來傳遞Skin和style的名字
TextButton button = new TextButton("Click me!", skin, "bigButton");
如果style的名字被忽略,那么就使用“default”
TextButton button = new TextButton("Click me!", skin);
Skin JSON
Skin可以通過編程來填充。或者,JSON可以用來描述Skin中已經命名過的對象。這使得定義UI widget style非常方便。注意JSON不用來描述regions,ninepatche splits 或者從texuture atlas中獲取的信息。然而,JSON可以通過名字去引用Skin中的regions, ninepatches和其他資源。JSON看起來像下面的:
{
className: {
name: resource,
...
},
className: {
name: resource,
...
},
...
}
"classname" 是完整的Java類的名稱。"name"是每個資源的名稱。"resource"是實際資源對象的JSON。JSON完全對應于資源類中字段的名稱。 這是一個真實的例子:
{
com.badlogic.gdx.graphics.Color: {
white: { r: 1, g: 1, b: 1, a: 1 },
red: { r: 1, g: 0, b: 0, a: 1 },
yellow: { r: 0.5, g: 0.5, b: 0, a: 1 }
},
com.badlogic.gdx.graphics.g2d.BitmapFont: {
medium: { file: medium.fnt }
},
com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: {
default: {
down: round-down, up: round,
font: medium, fontColor: white
},
toggle: {
down: round-down, up: round, checked: round-down,
font: medium, fontColor: white, checkedFontColor: red
},
green: {
down: round-down, up: round,
font: medium, fontColor: { r: 0, g: 1, b: 0, a: 1 }
}
}
}
首先,一些顏色和font被定義了。下一步,一些textbutton style被定義了。
字段:down,up, and checked是Drawable 類型。期望的一個對象但是在JSON文件中是字符串,這個字符串是名字,用來在Skin中查找對應的Drawable。Font和colors是一樣的道理,不過"green" textbutton style不同,它是定義了一個內聯(lián)的color.
注意:順序很重要。在JSON中,一個資源必須在引用前面進行聲明。另外注意Libgdx使用的JSON和標準JSON有點不同,在Libgdx中引號不是用來的定義Key或者value的。
顏色 Color
Colors 在JSON中的定義如上面的章節(jié)。如果r,g,b參數被忽略,則默認使用0。如果a參數被忽略,默認使用1?;蛘撸憧梢灾付?6進行的顏色值:
com.badlogic.gdx.graphics.Color: {
skyblue: { hex: 489affff }
}
BitmapFont
bitmap font在JSON中的聲明方式如下:
{
com.badlogic.gdx.graphics.g2d.BitmapFont: {
medium: { file: medium.fnt,
scaledSize: -1, //integer height of capital letters, default -1 for unscaled
markupEnabled: false,
flip : false}
}
}
為了找到font的BMFont文件,首先Skin會在其所在的文件夾尋找。如果沒有找到,則使用指定路徑。
為了找到font的圖像文件,首先SKin會查找和font文件一樣名字的textureregion,不攜帶文件名后綴。如果沒有找到,Skin會查找包含font文件的的目錄有font文件名字一樣的圖片,但是不看png后綴名。
TintedDrawable
給區(qū)域繪制不同的顏色非常有用。例如:一個白色按鈕的區(qū)域,可以被繪制為一個有任意顏色按鈕。Drawables可以用newDrawable方法染色。
The Skin.TintedDrawable class provides a way to tint drawables in JSON:
{
com.badlogic.gdx.graphics.Color: {
green: { r: 0, g: 1, b: 0, a: 1 }
},
com.badlogic.gdx.scenes.scene2d.ui.Skin$TintedDrawable: {
round-green: { name: round, color: green }
}
}
This makes a copy of the drawable named "round", tints it green, and adds it to the skin as a drawable under the name "round-green".