2013-09-12 1 views
0

Я просто собираюсь с скворцом и feathersui, пытаясь заставить тему перьев работать.starling feathersui кнопка тема не отображается

Мне удалось получить его так, чтобы цвет фона приложения изменился на цвет темы (так что я знаю, что тема загружается и работает правильно), но на кнопке или другом контроллере, который я пробовал, ничего не происходит. Кнопка представляет собой простой черный текст, без кнопки.

package { 
import starling.display.Sprite; 
import starling.display.Stage; 
import starling.display.Image; 
import starling.textures.Texture; 
import starling.events.Event; 
import starling.text.TextField; 

import feathers.controls.Button; 
import feathers.controls.Callout; 
import feathers.controls.Label; 
import feathers.controls.TextInput; 

import feathers.themes.MetalWorksMobileTheme 



public class Game extends Sprite 
{ 




public function Game() 
{ 


    this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 

var stageWidth = 640; 
    var stageHeight=960; 






var button:Button = new Button(); 
button.label = "Click Me"; 

button.x = 200; 
button.y = 500; 
addChild(button); 

} 


private function addedToStageHandler(event:Event):void 
{ 
new feathers.themes.MetalWorksMobileTheme(); 
} 


} 

} 

Я добавил путь к теме в настройках источника .source.

Должно быть, мне не хватает чего-то, что останавливает его от загрузки, любая помощь будет оценена.

ответ

0

Я думаю, что вам не хватает ссылки на сцену для объекта темы. Вам нужно сделать это, чтобы тема могла правильно подключить DisplayListWatcher.

Вот отрывок о том, как ваша тема должна быть:

public class Theme extends DisplayListWatcher { 

    public function Theme(container:DisplayObjectContainer = null, scaleToDPI:Boolean = true) { 

     if (!container) { 
      container = Starling.current.stage; 
     } 
     super(container); 
     Starling.current.nativeStage.color = BACKGROUND_COLOR; 
     if (root.stage) { 
      root.stage.color = BACKGROUND_COLOR; 
     } else { 
      root.addEventListener(Event.ADDED_TO_STAGE, root_addedToStageHandler); 
     } 

     _scaleToDPI = scaleToDPI; 
     initialize(); 
    } 

protected function initialize():void { 
    const scaledDPI:int = DeviceCapabilities.dpi/Starling.contentScaleFactor; 
    if (_scaleToDPI) { 
     if (DeviceCapabilities.isTablet(Starling.current.nativeStage)) { 
      _originalDPI = ORIGINAL_DPI_IPAD_RETINA; 
     } else { 
      _originalDPI = ORIGINAL_DPI_IPHONE_RETINA; 
     } 
    } else { 
     _originalDPI = scaledDPI; 
    } 
    scale = scaledDPI/_originalDPI; 

    if (DeviceCapabilities.isTablet(Starling.current.nativeStage)) fontSize = 40 * scale; 
    else fontSize = 36 * scale; 

    // init your texture and stuff 

    setInitializerForClass(Button, buttonInitializer); // call your button initializer 
} 

protected static function buttonInitializer(button:Button):void { 
     const skinSelector:Scale9ImageStateValueSelector = new Scale9ImageStateValueSelector(); 
     skinSelector.defaultValue = buttonUpSkinTextures; 
     skinSelector.defaultSelectedValue = buttonDownSkinTextures; 
     skinSelector.setValueForState(buttonDownSkinTextures, Button.STATE_DOWN, false); 
     skinSelector.setValueForState(buttonDisabledSkinTextures, Button.STATE_DISABLED, false); 
     skinSelector.imageProperties = { 
      width: 66 * scale, 
      height: 66 * scale, 
      textureScale: scale 
     }; 
     button.stateToSkinFunction = skinSelector.updateValue; 

     button.defaultLabelProperties.textFormat = new TextFormat(FontUtils.getFontName("bold"), fontSize * 0.9, COLOR_WHITE); 
     button.defaultSelectedLabelProperties.textFormat = new TextFormat(FontUtils.getFontName("bold"), fontSize * 0.9, COLOR_DARK_GREY); 
     button.downLabelProperties.textFormat = new TextFormat(FontUtils.getFontName("bold"), fontSize * 0.9, COLOR_DARK_GREY); 

     button.paddingTop = button.paddingBottom = 5 * scale; 
     button.paddingLeft = button.paddingRight = 10 * scale; 
     button.gap = 12 * scale; 
     button.minWidth = button.minHeight = 66 * scale; 
     button.minTouchWidth = button.minTouchHeight = 88 * scale; 
    } 
} 
0

У меня была такая же проблема, и мне потребовалось некоторое время, чтобы понять это, но это не так уж сложно, если вы об этом думаете.

То, что вы должны сделать, это добавить Темы каталога в исходной папку скворца.

Так что если у вас есть эта установка папки:

Загрузки/перья-1.1.1/документация

Загрузки/перья-1.1.1/примеры

...

Загрузки/перья-1.1.1/источник

Загрузки/перья-1.1.1/SWC

Загрузки/перья-1.1.1/темы

Сначала вы должны добавить папку источника на ActionScript Build Path. Затем перейдите к

Загрузки/перья-1.1.1/Темы/MetalWorksMobileTheme/источник/перья/темы

и скопировать эту папку в этом месте

Загрузки/перья-1.1.1/источник/перья

Новая тема теперь будет в правильной папке, а Flash Builder будет знать, где ее найти.

После этого вы можете получить некоторые ошибки, потому что тема ссылается на некоторые активы (шрифты и изображения), которые не найдены.Вы найдете их здесь:

Загрузки/перья-1.1.1/темы/MetalWorksMobileTheme/активы

скопировать эту папку на месте проекта или просто изменить пути в файле темы и все должно быть хорошо оттуда.

Кроме того, я думаю, вы должны добавить весь код создания кнопки в обработчик событий ADDED_TO_STAGE как это:

public function Game() 
{ 
    this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 

    var stageWidth : int = 640; 
    var stageHeight : int = 960; 
} 


private function addedToStageHandler(event:Event):void 
{ 
    new feathers.themes.MetalWorksMobileTheme(); 

    var button:Button = new Button(); 
    button.label = "Click Me"; 

    button.x = 200; 
    button.y = 500; 

    addChild(button); 
} 

Надеется, что это помогает

0

Вы должны добавить Button как ребенок после создания MetalWorksMobileTheme а не в конструкторе. Компоненты, добавленные на сцену до создания темы, не будут очищаться темой.