PDA

Volledige versie bekijken : Drag/Drop buttons


het meisje
%Europe/Berlin %784 %2010, 18:49
Het volgende probleem houdt me nu al dagen bezig:

Ik heb een movieclip met daarin een aantal buttons. Deze wil ik graag kunnen verslepen (het 'iPhone-effect'), en de buttons moeten klikbaar zijn.
Nu is eigenlijk alles gelukt, op 1 ding na: tijdens het slepen (Mouse Up eigenlijk) worden de buttons ook actief.
Nu heb ik verschillende malen gelezen dat het eigenlijk gewoon zou moeten werken als je voor drag en drop MOUSE_DOWN en MOUSE_UP gebruikt en voor de button CLICK, maar dat werkte dus niet.

Nu heb ik geprobeerd met de timer te werken, wat soms wordt geadviseerd. Hij tracet 'm wel, maar registreert het blijkbaar alsnog als MOUSE_UP.

Iemand nog ideeën?


var lastClick:int;

dragcontent.addEventListener(MouseEvent.MOUSE_DOWN , DragStart);

function DragStart (event) {
content.startDrag(false, new Rectangle(0, content.y, -8100.0, 0));
lastClick=getTimer();
}

dragcontent.addEventListener(MouseEvent.MOUSE_UP, DragStop);

function DragStop (event) {
content.stopDrag();
if (lastClick+100>getTimer()) {
trace("clicked");
}
}


De button code:


afbA.addEventListener(MouseEvent.CLICK,function(): void {
ExternalInterface.call("linkblabla");
}
);

Jarno!
%Europe/Berlin %504 %2010, 12:06
function DragStart (event) {
content.startDrag(false, new Rectangle(0, content.y, -8100.0, 0));
afbA.enabled = false;
}

function DragStop (event) {
content.stopDrag();
afbA.enabled = true;
}


Zoiets misschien?

het meisje
%Europe/Berlin %730 %2010, 17:32
Nee helaas, had al zoiets geprobeerd.
Iemand anders nog ideeën? Ik weet het echt niet meer...

Freeji
%Europe/Berlin %964 %2010, 23:08
var ikBenVerplaatst:Boolean = false;

mc.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
mc.addEventListener(MouseEvent.MOUSE_UP, onUp);
mc.addEventListener(MouseEvent.CLICK, onClick);

function onDown(e:Event){
this.addEventListener(MouseEvent.MOUSE_MOVE, beweeg);
this.startDrag();
}

function onUp(e:Event){
this.removeEventListener(MouseEvent.MOUSE_MOVE, beweeg);
this.stopDrag();
}

function beweeg(e:Event){
ikBenVerplaatst = true;
}

function onClick(e:Event){
if (ikBenVerplaatst == true){
trace("dragdrop");
ikBenVerplaatst = false; //maak boolean false zodat je elke keer weer kunt drag en droppen en niet 1 keer
}else{
trace("klik"); // hier je blabla link
}
}
De mouseMove event is alleen actief tussen mouseDown en MouseUp. Als je in de tussentijd je muis beweegt, beweeg je het object (drag/drop). Als je niet beweegt heb je een mouseClick en wil je de link openen. Is dit wat je wilt?

het meisje
%Europe/Berlin %050 %2010, 01:12
Aah ik dacht dat dit het was en dat ik rustig kon gaan slapen, maar het werkt blijkbaar nog niet helemaal.

In theorie is het inderdaad precies wat de bedoeling is. Maar op zich zou het goed gebruik van MOUSE_UP/DOWN/CLICK toch al voldoende moeten zijn?

Wat er nu gebeurd:
Het lijkt goed te gaan: de link opent niet na het draggen. Maar als ik daarna klik, gebeurd er niks. Na de 2e keer klikken opent de link wel. Maar als ik daarna weer drag, opent de link ook weer gewoon, wat dus niet hoort alleen bij klikken.

Oja, in de output klopt het allemaal wel (maar dat was eerst ook), er gebeurd alleen dus toch wat anders als ik het online test.

Bedankt voor de moeite iig.

Freeji
%Europe/Berlin %069 %2010, 01:39
Een MouseClick is in feite een MouseDown + MouseUp op hetzelfde object. Omdat je de mouseDown en de mouseUp ook gebruikt, doe je dus bij mouseUp twee events afhandelen. Namelijk de MouseUp en de MouseClick (de MousClick voltooi je op dat moment (mousedown + mouseUp)). Bij mouseDown gebeurt dit niet omdat je dan de MouseClick nog niet hebt voltooid. Het zijn dus wel losse handlers maar in deze situatie werkt dat dus niet. Je moet flash dus duidelijk maken wanneer je de mouseUp gebruikt en wanneer je de mouseClick gebruikt.

Hoe gebruik je de code? Op een Movieclip die rechtstreeks op je stage staat of op een movieclip die in een andere Movielcip staat? op de timeline?

het meisje
%Europe/Berlin %502 %2010, 12:03
Hoe gebruik je de code? Op een Movieclip die rechtstreeks op je stage staat of op een movieclip die in een andere Movielcip staat? op de timeline?

Dat laatste dus. Een mc in een andere mc. En daarin dus weer die buttons.

Freeji
%Europe/Berlin %940 %2010, 22:33
Oke, open een nieuw document in flash met een timeline van 1 frame.
zet in dat frame deze code.


var ikBenVerplaatst:Boolean = false;
var targetURL:URLRequest = new URLRequest();

mc_blauw.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
mc_blauw.addEventListener(MouseEvent.MOUSE_UP, onUp);
mc_blauw.addEventListener(MouseEvent.CLICK, onClick);

function onDown(e:Event){
this.addEventListener(MouseEvent.MOUSE_MOVE, beweeg);
this.startDrag();
}

function onUp(e:Event){
this.removeEventListener(MouseEvent.MOUSE_MOVE, beweeg);
this.stopDrag();
}

function beweeg(e:Event){
ikBenVerplaatst = true;
}

function onClick(e:Event){
if (ikBenVerplaatst == true){
ikBenVerplaatst = false; //maak boolean false zodat je elke keer weer kunt drag en droppen en niet 1 keer
}else{
var mc_naam:String = e.target.name; //e = event. dit event hangt aan de moedermovieclip (de blauwe movieclip). Met .target geef je aan dat je de movieclips in de moedermovieclip wilt hebben
switch(mc_naam){
case "rood":
targetURL.url="http://www.rood.nl";
navigateToURL(targetURL);
break;
case "groen":
targetURL.url="http://www.groen.nl";
navigateToURL(targetURL);
break;
case "geel":
targetURL.url="http://www.geel.nl";
navigateToURL(targetURL);
break;
}

}
}
maak nog even een aantal movieclips aan.
een mc_blauw als hoofdmovieclip met een instance name mc_blauw
in mc_blauw zitten 3 ander movieclips, mc_rood, mc_groen, mc_geel. De instance names zijn respectievelijk rood,groen,geel.

dit in combinatie met de code zou moeten werken. succes.