Tooltip über Link?

declan77

Grünschnabel
Hallo zusammen,

ich habe eine Flash-Animation, die einige Movieclips enthält, auf denen per on (release) Anweisung Links liegen.

Außerdem habe ich gerade ein Tooltip-Actionscript hineingeschrieben, das über den Aufruf _root.toolTip(_root.clip1, "Das ist ein Movieclip."); einen Tooltip einblendet.

Alles soweit OK.
Die Links funktionieren. Die Tooltips für sich auch, nur nicht auf dem Link.
Wenn der Mauszeiger zu einer Hand für den Link wird, ist der Tooltip hinüber.

Es muss doch irgendwie möglich sein, den Tooltip an die Maus des Links zu setzen - wie?

Danke,
Sascha
 
Hallo und willkommen,

das Problem ist, dass in AS2 nur ein onRollOver aufs Mal registriert wird. In deinem Fall bindet der Link anscheinend stärker. Ich empfehle dir eine Lösung mit onMouseMove, die unabhängig von den normalen Button-Events funktioniert.

Gruss
 
Hehe. Danke für die tolle Idee.
Ich kann nur sagen.... fast hätt es geklappt!

Nun zeigt er den Tooltip an, lädt den Link aber zunächst nicht.
Erst im zweiten Durchlauf aktiviert er den on (release) Link.
Nun... bewege ich dann aber auch nur einmal die Maus, wird quasi nun das Link-Ereignis wieder überschrieben und der Mauszeiger somit wieder zu einem Pfeil.

Grummel.
 
Gerne.
Hier also zunächst der Tooltip:

Code:
//Main function
function toolTip(tagTarget, myMessage) {
//Handle the rollOver event
tagTarget.onRollOver = function() {
//disable hand cursor
tagTarget.useHandCursor = false;
//create a movieclip to hold the tooltip MC
h = _root.createEmptyMovieClip("h", 10);
//position the tooltip dynamically to the mouse position
h._y = _root._ymouse-30;
h._x = _root._xmouse;
//attach the tooltip MC from the library
h.attachMovie("toolTip_MC", "toolTip_MC", 10);
//format the message textfield
h.toolTip_MC.message.autoSize=true;
h.toolTip_MC.message.border=true;
h.toolTip_MC.message.backgroundColor=0x00FFCC;
//control the message with the myMessage parameter of the function
h.toolTip_MC.message.text = myMessage;
//position the tooltip on mouse move
h.onMouseMove = function() {
h._y = _root._ymouse-30;
h._x = _root._xmouse;
}
//trace("I was hit");
}
//remove the tool tip
tagTarget.onRollOut = function() {
removeMovieClip(h);
}
}



Aufruf über:

Code:
_root.onMouseMove = function() {
	_root.toolTip(_root.image1, "Das ist ein Movieclip."); 
}


Und die Tooltips sollen zu sehen sein, wenn man über die Images-Movieclips image1.... und so weiter mit der Maus fährt, die sind momentan wie folgt verlinkt:

Code:
on (release) {
	getURL("http://www.domain.de", "_self");
}


Vielleicht könnte ich auch den Link über eine andere Prozedur aufrufen, die nicht den Tooltip überschreibt?

Danke & Gruß
 
Hallo,

hab das Problem mit zwei Prototypen gelöst. Prototypen erweitern Klassen um einzelne Funktionen, in diesem Fall betrifft das nun die MovieClip-Klasse. Du kannst die folgenden zwei Funktionen also irgendwo auf der Hauptzeitleiste deponieren und sie gelten dann für jeden MovieClip deines Projekts.
Code:
MovieClip.prototype.setTooltip = function (a_message: String): Void {
	
	//Hier speicherst du jeden MouseEvent, den du für die Tooltips brauchst
	this.oldReleaseFnc = this.onRelease;
	this.oldRollOverFnc = this.onRollOver;
	this.oldRollOutFnc = this.onRollOut;
	
	//Eine Referenz des Strings, der im Tooltip angezeigt werden soll.
	this.tooltipMessage = a_message;
	
	//Hier setzt du die Tooltip-Aktionen für die Events
	this.tooltipRelease = function () {
		//Anweisungen
		trace ("Tooltip Release");
	}
	
	this.tooltipRollOver = function () {
		//Anweisungen
		trace ("Tooltip RollOver");
	}
	
	this.tooltipRollOut = function () {
		//Anweisungen
		trace ("Tooltip RollOut");
	}
	
	this.onRelease = function () {
		this.oldReleaseFnc();
		tooltipRelease();
	}
	
	this.onRollOver = function () {
		this.oldRollOverFnc();
		tooltipRollOver();
	}
	
	this.onRollOut = function () {
		this.oldRollOutFnc();
		tooltipRollOut();
	}
}

MovieClip.prototype.unsetTooltip = function (): Void {
	
	this.onRelease = function () {
		this.oldReleaseFnc();
	}
	
	this.onRollOver = function () {
		this.oldRollOverFnc();
	}
	
	this.onRollOut = function () {
		this.oldRollOutFnc();
	}
}

Das Prinzip dieser Funktionen ist, die ursprünglichen MouseEvents zwischenzuspeichern und um die Tooltip-Funktionen zu erweitern. Das setzt voraus, dass die Tooltip-Initialisierung NACH allfälligen MouseEvent-Deklarationen geschieht, sonst werden die zugehörigen Funktionen wieder überschrieben. Besonders aufpassen musst du da bei Code, den du auf MovieClips platzierst, da der erst nach allfälligen Operationen auf übergeordneten Zeitleisten ausgeführt wird. Solltest du eine Tooltip-Nachricht ändern wollen, ist es zwingend, dass du erst unsetTooltip ausführst, da sonst die Tooltip-Funktionen als "alte" gewertet werden und so pro Änderung immer einmal mehr ausgeführt werden.
Ein Beispiel:
Code:
//Test ist ein beliebiger MovieClip
test.onRelease = function () {
	getURL("http://www.tutorials.de");
}

test.onRollOut = function () {
	trace ("Normaler RollOut");
}

test.onRollOver = function () {
	trace ("Normaler RollOver");
}

test.setTooltip("Hallo Welt");

Gruss
 
Hey, deinen Ansatz habe ich verstanden... klingt gut.

Habe nun das Problem, dass Flash die Funktionen mit Fehlermeldungen quittiert.
Vor allem kann ich die nicht nachvollziehen...

Wenn beide function():void haben, taucht der Fehler auf:

**Fehler** Szene=Scene 1, Ebene=tooltip, Bild=1:Zeile 1: '{' erwartet
MovieClip.prototype.setTooltip = function (a_message:string):void {

Doch die Klammern sind alle (wie in deinem Codebeispiel) gesetzt!
Nehme ich das :void raus... läuft das Filmchen... allerdings immer noch ohne Tooltips.

Ohne die Angabe :void tut er zumindest etwas.
Aber puh... ich bin nicht so der Flash-Crack und brauche das wohl transparenter ;)

Im Teil //Anweisungen könnte ich doch also jetzt mit meinen Tooltip-Events aus dem vorherigen Actionscript kommen?

Hast du nicht mal ein Beispiel-Skript mit dem es funktioniert?

Gruß
 
Zurück