Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > Flex

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.03.2012, 19:00
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 1  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию HSlider + кнопка increase value - не изменяется value компонента

Здравствуйте
я сделал кастомный Hslider с 2мя кнопками "+" и "-" для увеличения уменьшения value
Но в компоненте value при нажатии на эти кнопки почему-то NaN
Причем, это всегда до того момента как я мышкой первый раз двину thumb слайдера, после этого компонент знает свою value
Почему так и что доделать ?
вот компонент
Код AS3:
package com
{
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	import spark.components.Button;
	import spark.components.HSlider;
 
 
	public class CustomHSlider extends HSlider
	{
		public function CustomHSlider()
		{
			super();
		}
 
		[SkinPart(required="true")]
		public var decreaseValueButton:Button;
 
		[SkinPart(required="true")]
		public var increaseValueButton:Button;
 
		override public function set value(newValue:Number):void
		{
			super.value=newValue;
		}
 
		override protected function partAdded(partName:String, instance:Object):void
		{
			super.partAdded(partName, instance);
			if(instance == decreaseValueButton)
			{
				decreaseValueButton.addEventListener(MouseEvent.CLICK,decreaseValueButtonClickHandler);
			}
			if(instance == increaseValueButton)
			{
				increaseValueButton.addEventListener(MouseEvent.CLICK,increaseValueButtonClickHandler);
			}
		}
 
		override protected function partRemoved(partName:String, instance:Object):void
		{
			super.partRemoved(partName, instance);
			if(instance == decreaseValueButton)
			{
				decreaseValueButton.buttonMode=true;
				decreaseValueButton.addEventListener(MouseEvent.CLICK,decreaseValueButtonClickHandler);
			}
			if(instance == increaseValueButton)
			{
				increaseValueButton.buttonMode=true;
				increaseValueButton.addEventListener(MouseEvent.CLICK,increaseValueButtonClickHandler);
			}
		}
 
 
		protected function decreaseValueButtonClickHandler(event:MouseEvent):void
		{
			commitProperties();
			value-=snapInterval;
			dispatchEvent(new Event(Event.CHANGE));
		}
		protected function increaseValueButtonClickHandler(event:MouseEvent):void
		{
			commitProperties();
			value+=snapInterval;
			dispatchEvent(new Event(Event.CHANGE));
		}
	}
}
вот скин

Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" 
			 xmlns:s="library://ns.adobe.com/flex/spark"
    		xmlns:fb="http://ns.adobe.com/flashbuilder/2009" 
			xmlns:assets="assets.*"
			minHeight="11" 
			alpha.disabled="0.5">
 
    <fx:Metadata>
    	<![CDATA[ 
       	 	[HostComponent("com.CustomHSlider")]
    	]]>
    </fx:Metadata> 
 
 
    <fx:Script>
        override protected function measure() : void
        {
            var thumbPos:Number = thumb.getLayoutBoundsX();
            thumb.setLayoutBoundsPosition(0, thumb.getLayoutBoundsY());
            super.measure();
            thumb.setLayoutBoundsPosition(thumbPos, thumb.getLayoutBoundsY());
        }
    </fx:Script>
 
    <s:states>
        <s:State name="normal" />
        <s:State name="disabled" />
    </s:states>
 
    <fx:Declarations>
 
    </fx:Declarations>
 
	<assets:HSliderBackground left="-6" right="-6" top="-3"/>
 
    <s:Button id="track" 
			  left="0" 
			  right="0" 
			  top="2"
			  minWidth="33" 
			  width="100" 
              tabEnabled="false"
              skinClass="com.skins.HSliderTrackSkin" 
			  buttonMode="true"/>
    <s:Button id="thumb" 
			  width="11" 
			  height="11" 
              tabEnabled="false"
              skinClass="com.skins.HSliderThumbSkin" 
			  buttonMode="true"/>
	<s:Button id="decreaseValueButton" 
			  skinClass="com.skins.HSliderDecreaseButtonSkin" 
			  left="-20" 
			  buttonMode="true"
			  tabEnabled="false"/> 
	<s:Button id="increaseValueButton" 
			  skinClass="com.skins.HSliderIncreaseButtonSkin" 
			  right="-20" 
			  buttonMode="true"
			  tabEnabled="false"/> 
</s:SparkSkin>

Старый 26.03.2012, 19:37
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 2  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
У HSlider (точнее у его предка TrackBase) есть метод changeValueByStep используйте его для увеличения и уменьшения значения. В нем же будет отправлено CHANGE.

Зачем вы вызываете commitProperties() напрямую? Тем более, что сами его никак не используете. Изменение value вызовет invalidateProperties, что в свою очередь вызовет commitProperties.

Вы всю логику компонента перекорежили.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 26.03.2012, 19:52
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 3  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Цитата:
Сообщение от alatar Посмотреть сообщение
Зачем вы вызываете commitProperties() напрямую?
Это я забыл убрать, прошу прощения.
Спасибо за ответ

Цитата:
Сообщение от alatar Посмотреть сообщение
Вы всю логику компонента перекорежили.
Чем, коммитами или насильным диспатчем события ?

Все равно, value изначально NaN
Я вот как переделал
Код AS3:
protected function decreaseValueButtonClickHandler(event:MouseEvent):void
		{
			if(isNaN(value))
			{
				value=1.1;
			}
			else
			{
				this.changeValueByStep(false);
			}
		}
		protected function increaseValueButtonClickHandler(event:MouseEvent):void
		{
			if(isNaN(value))
			{
				value=1.1;
			}
			else
			{
				this.changeValueByStep(true);
			}
		}


Последний раз редактировалось djyamato; 26.03.2012 в 20:01.
Старый 27.03.2012, 20:38
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 4  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Все равно, value изначально NaN
Где-то еще накосячили. Код вставки вашего компонента покажите. И что ему изначально задаете в value.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 27.03.2012, 23:37
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 5  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
Код AS3:
<com:CustomHSlider minimum="{AppData.getInstance().minZoom}" 
								maximum="{AppData.getInstance().maxZoom}"
								value="{AppData.getInstance().currentZoom}"
								snapInterval=".1"
								stepSize=".1"
								liveDragging="true"
								mouseFocusEnabled="false"
								mouseWheel="hslider1_mouseWheelHandler(event)"
								change="hslider1_changeHandler(event)"/>
Да, если вставить явно value="1" то нет такого лага, но ведь AppData.getInstance().currentZoom изначально тоже равна единице

Старый 28.03.2012, 12:02
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 6  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
но ведь AppData.getInstance().currentZoom изначально тоже равна единице
Вот здесь у вас корень "проблемы". В какой-то момент он у вас NaN.
__________________
משיח לא בא
משיח גם לא מטלפן

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:13.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.