Архів для категорії ‘Найденные блохи’

[Flex 3] PopUpButton.closeOnActivity

четверг, февраль 28, 2008

У Flex є такий компонент PopUpButton. Поведінка його схожа на ComboBox, тільки ми маємо можливість задати будь-який компонент який відкриється при натисканні. Але маємо неприємність з тим, що при натисканні на щойно відкритий компонент він зразу зачиняється. Тобто ми не можемо використовувати, наприклад, List з встановленим allowMultipleSelection=true та вибрати декілька елементів в List. У компонента PopUpButton є потрібна нам властивість:

/**
*  @private
*  Storage for the closeOnActivity property.
*/
private var _closeOnActivity:Boolean = true;

/**
*  @private
*  Specifies popUp would close on click/enter activity.
*  In popUps like Menu/List/TileList etc, one need not change
*  this as they should close on activity. However for multiple
*  selection, and other popUp, this can be set to false, to
*  prevent the popUp from closing on activity.
*
*  @default true
*/
private function get closeOnActivity():Boolean
{
	// We are not exposing this property for now, until the need arises.
	return _closeOnActivity;
}

/**
*  @private
*/
private function set closeOnActivity(value:Boolean):void
{
	_closeOnActivity = value;
}

Але як бачите вона є private :)

Рішення:

Потрібно зупинити всі MouseEvent.Click від нашого PopUp’у :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
	<mx:PopUpButton>
		<mx:popUp>
			<mx:List id="list" allowMultipleSelection="true">
				<mx:dataProvider>
					<mx:Array>
						<mx:String>Один</mx:String>
						<mx:String>Два</mx:String>
						<mx:String>Три</mx:String>
						<mx:String>Чотири</mx:String>
						<mx:String>П'ять</mx:String>
					</mx:Array>
				</mx:dataProvider>
			</mx:List>
		</mx:popUp>
	</mx:PopUpButton>
	<mx:creationComplete>
		<![CDATA[
			list.addEventListener(MouseEvent.CLICK, listClickHandler, true);
		]]>
	</mx:creationComplete>
	<mx:Script>
		<![CDATA[
			private function listClickHandler(event:MouseEvent):void
			{
				event.stopImmediatePropagation();
			}
		]]>
	</mx:Script>
</mx:Application>

TextField, що створений у Flash IDE

суббота, февраль 2, 2008

Маємо:

  1. Створений руцями TextField, з ім’ям fleaT, та синього кольору (#0000FF);
  2. Код у першому кадрі:
    /*
    removeChildAt(0); // deleting the texfield created by hands
    fleaT = new TextField();
    addChild(fleaT);
    */
    
    var tf:TextFormat = new TextFormat();
    tf.color = 0xFF0000;
    fleaT.setTextFormat(tf);
    fleaT.defaultTextFormat = tf;
    
    fleaT.textColor = 0xFF0000;
    
    fleaT.htmlText = "TextField<font color='#00FF00'> flea</font>";

Якби це було загадкою, і треба було відповісти яким кольором будуть слова у текстовому полі, то я б відповів, що слово “TextField” буде червоним (#FF0000), а “flea” - зеленим (#00FF00). Але ця відповідь буде вірною, якщо перші три рядки не будуть закоментовані (якщо TextField буде створено за допомогою ActionScript). А без перших рядків слово “TextField” буде синього кольору (#0000FF), тобто тим кольором який ми призначили руцями.

Graphics.beginBitmapFill()

среда, январь 23, 2008

При фарбуванні Bitmap-ою, фарбування відбувається починаючи з координат x:0, y:0, а тоді наша фігура (наприклад, при drawRect() це буде прямокутник) “нібито” стає маскою для щойно зафарбованої прощини. У прикладі при тяганні повзунка я наново перефарбовую Shape.graphics змінюючи тільки x та y для drawRect():

Цей ролик потребує Flash Player 9

Оновлення: Як виявилось, ця блоха тільки для мене і тільки в одному з проектів :) Насправді, якщо Вам потрібна така дія, яку очікував я, то Вам потрібно використовувати матрицю зі зміщенням як другий параметр до функції Graphics.beginBitmapFill(). Наведу приклад:

var m:Matrix = new Matrix();
m.translate(posX, posY); // posX та posY - це бажана позиція кінцевого прямокутника (чи будь-якої іншої фігури)
someShape.graphics.lineStyle();
someShape.graphics.beginBitmapFill(someBitmap, m);
someShape.graphics.drawRect(posX, posY, someBitmap.width, someBitmap.height); // ті ж самі posX та posY
someShape.graphics.endFill();

Блоха з DisplayObject.alpha

четверг, январь 17, 2008

Ми всі знаємо, що DisplayObject.alpha в ActionScript 3.0 працює з числами від 0 до 1. Але:

  1. DisplayObject.alpha приймає числа з рухомою комою від -128 до 127.
  2. DisplayObject.alpha має тип Number, але в нього така-ж поведінка при переповненні як і в int. Тобто якщо Ви подасте значення 128, то alpha буде дорівнювати -128.
  3. Якщо alpha більше ніж 1, то по краях усіх Bitmap-ів будуть помітні неприємні артефакти.

    Цей ролик потребує Flash Player 9

  4. Оновлення: Якщо для контейнеру виставляти alpha, наприклад, 0.5, а для його дитини 127/2, то дитина не буде прозора. Добто тут має місце компенсація прозорості. Але вона перестає діяти, якщо у контейнера alpha дорівнює 0. На прикладі зрозуміліше (потягайте повзунок):

    Цей ролик потребує Flash Player 9

    Дякую за підказку Іллю Паніна.

Оператор if керує поведінкою компілятора :)

четверг, январь 17, 2008

Якщо в тілі умовного оператора є не серьозна помилка, а умова така, що тіло ніколи не виконається, то компілятор нічого не скаже про помилку.

Приклад:

var t:Number;
if (false){
	t = "hello";
}

Якщо Ви змінете false на true, то отримаєте помилку “1067: Implicit coercion of a value of type String to an unrelated type Number.”.

Це стосується тільки ActionScript 3.0, тобто така поведінка має місце в Flash CS3 та Flex Builder 2. В ActionScript 2.0 такої блохи немає.

Також це не стосується умовного оператора ?:.

Оновлення: 

Деякі не серьозні помилки можуть призвести до такої-ж поведінки як в попередній блосі.

var t:Number;
if (false){
	1 == null;
}