Просмотр полной версии : Проблема с DOUBLE_CLICK
eXplozive
24.10.2006, 13:04
Всем добрый день... вот есть такой кодик:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="initApp()">
<mx:Script>
<![CDATA[
import flash.events.*;
import mx.controls.Alert;
private function alrt(txt){
Alert.show(txt);
}
public function initApp():void {
pic.addEventListener(MouseEvent.MOUSE_DOWN, start_drag);
pic.addEventListener(MouseEvent.MOUSE_UP, stop_drag);
pic.addEventListener(MouseEvent.DOUBLE_CLICK, double);
}
public function start_drag(e:Event):void {
pic.startDrag();
}
public function stop_drag(e:Event):void {
pic.stopDrag();
}
public function double(e:Event):void {
alrt("Double click");
}
]]>
</mx:Script>
<mx:Image x="120" y="230" source="globe.jpg" id="pic"/>
</mx:Application>
вобщем листнеры на нажатие и отпускание кнопи мышки - работают, а вот на двойной клик почемуто не проходит... Если кто знает - подскажите...
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="initApp()">
<mx:Script>
<![CDATA[
import flash.events.MouseEvent;
import mx.controls.Alert;
private function alrt(txt:String):void {
Alert.show(txt);
}
private function initApp():void {
this.doubleClickEnabled = true;
this.pic.addEventListener(MouseEvent.MOUSE_DOWN, this.startDragHandler);
this.pic.addEventListener(MouseEvent.MOUSE_UP, this.stopDragHandler);
this.pic.addEventListener(MouseEvent.DOUBLE_CLICK, this.doubleClickHandler);
}
private function startDragHandler(e:MouseEvent):void {
this.pic.startDrag();
}
private function stopDragHandler(e:MouseEvent):void {
this.pic.stopDrag();
}
private function doubleClickHandler(e:MouseEvent):void {
this.alrt("Double click");
}
]]>
</mx:Script>
<mx:Image x="120" y="230" source="globe.jpg" id="pic" width="372" height="314"/>
</mx:Application>
А вообще, хелп — очень полезная штука. Методом тыка писать код, не читая хелп — извращение.
MerlinTwi
24.10.2006, 13:53
__etc, а почему ты постоянно пишешь this. ? Привычка от AS2 или же в этом есть какой-то подвох?
И да и нет. this я пишу всегда. Или, например, такая конструкция очень показательна:
package {
public class AnyClass {
private var param:Number;
public function AnyClass() {
}
public function setParam(param:Number):void {
param = param;
trace(this.param); // NaN
this.param = param;
trace(this.param); // 12
}
}
}
Поэтому — всегда.
Тот же пример:
package {
public class AnyClass {
private var param:Number;
public function AnyClass() {
}
public function setParam(param:Number):void {
param = param;
}
public function getParam():Number {
return param;
}
}
}
var a:AnyClass = new AnyClass();
a.setParam(12);
trace(a.getParam(12)); // NaN
В общем, я даю понять компилятору, что я от него хочу.
Плюс к тому — привычка и просто потому что если я напишу «this.», то выпадет список со всеми нужными свойствами, методами и т.п.
eXplozive
24.10.2006, 14:08
Спасибо ... Хелп читаю , чесс слово ... итак стараюсь сейчас обращятся только в крайних случаях... Еще раз спасибо за ответ
MerlinTwi
24.10.2006, 14:10
Код param = param; по своей сути бессмысленен, и тогда уж, по аналогии:
this.param = this.param;
Тоже фигня будет ;)
this.param = this.param;
Тоже фигня будет ;)
Само собой, но мне нужно присвоить значение свойству класса из аргумента метода, который называется точно также, как и свойство класса. Поэтому this обязателен.
Ну и про выпадающий список свойств я уже говорил.
Мне быстрее набрать this и Control+Enter, чем искать, как называется метод и писать его полное имя (Flex на Control+Space просто так ничего не выдаст).
BlooDHounD
24.10.2006, 15:12
Код param = param; по своей сути бессмысленен, и тогда уж, по аналогии:
this.param = this.param;
Тоже фигня будет ;)
на самом деле просто удобнее читать код, когда идут чёткие указатели на переменную. я тоже всегда пишу this. читая код я всегда чётко знаю что без указателей у меня локальные переменные.
без указателей у меня локальные переменные.
Ага, именно так.
MerlinTwi
24.10.2006, 15:31
Интересно, а компилятор этот this заносит в код?
Интересно, а компилятор этот this заносит в код?
AS2 — да (можно проверить декомпилятором), но не везде, только лишь в подобных случаях, что я привёл. Судя по всему, AS3 тоже. Иначе всегда был бы NaN.
MerlinTwi
24.10.2006, 16:01
Тогда из твоего примера:
private function initApp():void {
this.doubleClickEnabled = true;
this.pic.addEventListener(MouseEvent.MOUSE_DOWN, this.startDragHandler);
this.pic.addEventListener(MouseEvent.MOUSE_UP, this.stopDragHandler);
this.pic.addEventListener(MouseEvent.DOUBLE_CLICK, this.doubleClickHandler);
}
. . .
Это полный аналог:
private function initApp():void {
doubleClickEnabled = true;
pic.addEventListener(MouseEvent.MOUSE_DOWN, this.startDragHandler);
pic.addEventListener(MouseEvent.MOUSE_UP, this.stopDragHandler);
pic.addEventListener(MouseEvent.DOUBLE_CLICK, this.doubleClickHandler);
}
. . .
Только длинее и сложнее для исполнения (лишняя команда в байткоде). Получается так.
Только длинее и сложнее для исполнения (лишняя команда в байткоде). Получается так.
Нет, в данном случае this не добавляется.
MerlinTwi
24.10.2006, 16:20
Теоретически, скорее всего так, практически пока проверить сложно, из-за отсутствия декомпиляторов АС3 (а в RAW коде я не силен).
Т.е. вставка this. там где он не нужен обусловлен:
1. Проще набирать названия методов и свойств во Flex
2. Уберечь себя от ошибок если в коде встретятся локальная переменная и свойство/метод класса с одинаковым названием
3. При чтении кода видно четкое различие между локальными переменными и свойствами/методами класса
ok, принято, спасибо за комментарии :)
MerlinTwi, да, именно это имелось ввиду. Спасибо, что собрал из нашего бреда нормальный вывод :D
А про добавление this — так ведёт себя компилятор AS2, как там в AS3 — не знаю, скорее всего также.
websterkz
12.06.2009, 18:40
всем привет. у меня такая проблемка не работает DOUBLE_CLICK. почитал посты что выше, попробывал не вышло. кто может подсказать(указать:rtfm:) где я ошибся :)
А вы документацию по DOUBLE_CLICK открывали?
websterkz
15.06.2009, 08:36
А вы документацию по DOUBLE_CLICK открывали?
да открывал и читал, но все же не получается, или до меня просто что-то не доходит :umnik2:
websterkz
15.06.2009, 13:35
Плохо открывали, значит.
ну и на этом спасибо...
а кто нибудь может помочь? я же просто указать на ошибку в коде, неужели это так трудно?
package {
import flash.display.*;
import flash.events.*;
import flash.geom.ColorTransform;
import fl.transitions.*;
import fl.transitions.easing.*;
public class CreateObj extends Sprite {
private var target = null;
private static var XminSize:int = 300;
private static var YminSize:int = 350;
private static var useMinStageSize:Boolean = false;
public function CreateObj ():void {
// Create obl
var obl1:MovieClip = new obl_mc1();
addChild(obl1);
obl1.x=86.2;
obl1.y=98.2;
var obl2:MovieClip = new obl_mc2();
addChild(obl2);
obl2.x=94.5;
obl2.y=183.6;
var obl3:MovieClip = new obl_mc3();
addChild(obl3);
obl3.x=110.4;
obl3.y=262.6;
var obl4:MovieClip = new obl_mc4();
addChild(obl4);
obl4.x=218.4;
obl4.y=161;
this.doubleClickEnabled = true;
this.addEventListener(MouseEvent.DOUBLE_CLICK, this.DoubleClick);
this.addEventListener(MouseEvent.CLICK, this.Click);
}
private function Click(e:MouseEvent):void{
var newColorTransform:ColorTransform = e.target.transform.colorTransform;
newColorTransform.color = 0xff6532;
e.target.transform.colorTransform = newColorTransform;
if (target) {
target.transform.colorTransform = new ColorTransform();
}
target = e.target;
}
private function DoubleClick(e:MouseEvent):void{
trace("DoubleClick");
var rx:Number = this.width / e.target.width;
var ry:Number = this.height / e.target.height;
var r:Number = Math.min(rx, ry);
trace(this);
trace(this.x + " " + this.y);
this.scaleX *= r;
this.scaleY *= r;
this.x -= (e.target.x - e.target.width / 2) * r;
this.y -= (e.target.y - e.target.height / 2) * r;
trace(stage.stageWidth + " " + stage.stageHeight);
if (useMinStageSize) {
if (stage.stageWidth < XminSize || stage.stageHeight < YminSize) {
return;
}
}
}
}
}
попробуй поставить doubleClickEnabled = true конкретно детям, а не всему контейнеру
websterkz
16.06.2009, 08:50
попробуй поставить doubleClickEnabled = true конкретно детям, а не всему контейнеру
:victory: пасиба!!! работает... правда теперь меня терзает вопрос, неужели нельзя как нибудь обобщенно написать для всех, а не конкретно детям?:umnik2:
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.