Smileyfield :: textfield avec smiley images

0/5 (13 avis)

Vue 6 826 fois - Téléchargée 870 fois

Description

voici un textfield qui prend en compte les smiley!
enfin!!!
il recherche les smiley et les transforme en image, grace a un xml qui permet la correspondance ascii->fichier.

Le code est pas super complexe, mais un debutant va vite etre pommé kan meme.

Tres utile pour une application de chat par exemple.

Source / Exemple :


XML_FILE = "smiley.xml";
SPACE = 4;
LEADING = 18;
MAXWIDTH = 200;
x = new XML();
x.ignoreWhite = true;
x.load(_root.XML_FILE);
x.onLoad = function(success) {
	_root.xmlloaded = true;
};
monFormat = new TextFormat();
monFormat.font = "arial";
monFormat.size = 12;
monFormat.type = "static";
//********************************************************************************
String.prototype.replace = function(str, rep, chr) {
	var t = (chr<0) ? this.substr(chr) : this.substr(0, chr);
	var s = str.length;
	var r = rep.length;
	var p = t.indexOf(str);
	while (p != -1) {
		t = t.substr(0, p)+rep+t.substr(p+s);
		p = t.indexOf(str, p+r);
	}
	return (chr) ? (chr<0) ? this.substr(0, this.length+chr)+t : t+this.substr(chr) : t;
};
String.prototype.transCode = function() {
	input = this;
	input = input.replace("é", "e");
	input = input.replace("è", "e");
	input = input.replace("à", "a");
	input = input.replace("ç", "c");
	input = input.replace("ë", "e");
	input = input.replace("ê", "e");
	input = input.replace("ù", "u");
	//input = input.toLowerCase();
	return input;
};
function isSmiley(input) {
	_root.local_rez = 0;
	ixml = 0;
	while (x.childNodes[0].childNodes[ixml] != undefined) {
		S_SMILEY = x.childNodes[0].childNodes[ixml].attributes.smiley;
		S_URL = x.childNodes[0].childNodes[ixml].attributes.url;
		S_W = x.childNodes[0].childNodes[ixml].attributes.w;
		S_H = x.childNodes[0].childNodes[ixml].attributes.h;
		ixml++;
		if (input == S_SMILEY) {
			_root.s_var = S_SMILEY+" "+S_URL+" "+S_W+" "+S_H;
			_root.local_rez = 1;
		}
	}
	return _root.local_rez;
}
MovieClip.prototype.write = function(input) {
	y_size += LEADING;
	x_size = 0;
	input = input.transCode();
	tbl = input.split(" ");
	for (i=0; i<=tbl.length-1; i++) {
		reading = tbl[i];
		if (!_root.isSmiley(reading)) {
			d++;
			this.createTextField("tf"+d, d, x_size, y_size, 0, 0);
			this["tf"+d]._visible = 1;
			this["tf"+d].text = reading;
			//this["tf"+d].setTextFormat(monFormat);
			this["tf"+d].textColor = "0x000000";
			this["tf"+d].selectable = false;
			this["tf"+d].autoSize = true;
			x_size += this["tf"+d].textWidth+SPACE;
			if (x_size>=MAXWIDTH) {
				x_size = 0;
				y_size += LEADING;
			}
		} else {
			sv = _root.s_var.split(" ");
			d++;
			this.smiley.duplicateMovieClip("smiley"+d, d);
			this["smiley"+d].loadMovie(sv[1]);
			this["smiley"+d]._x = x_size;
			this["smiley"+d]._y = y_size;
			this["smiley"+d]._visible = 1;
			x_size += SPACE+int(sv[2]);
		}
	}
	this["border"]._y = LEADING-1;
	this["border"]._width = MAXWIDTH;
	this["border"]._height = y_size+2;
	this["border"].swapDepths(d+100);
};

Conclusion :


pour fonctionner, fo tout decompresser dans le meme rep!
le swf dans le zip, sert a rien si le reste est pas decompressé...

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
235
Date d'inscription
mercredi 4 avril 2001
Statut
Membre
Dernière intervention
9 novembre 2007

hmmmm désolé à l'utilisation j'ai découvert un bug de placement. En effet je remplaçais tous les smileys d'un meme type, puis d'un autre, etc... Cela avait pour effet de décaler les smileys a cause des espaces différents entre les types de smileys.
La solution consiste donc à remplacer le premier smiley trouvé, quel qu'il soit. Voici la solution finale:

var smileys:Array = new Array();
smileys.push({search:"[:)]",attach:"smiley_smile",replace:" "})
smileys.push({search:"[;)]",attach:"smiley_wink",replace:" "})

findNextSmiley = function(txt:String){
var id=10000; // rarement vu un texte plus long.
var pos=-1;
for(var smiley in smileys){
var i=txt.indexOf(smileys[smiley].search);
if((i<id) && (i!=-1)){id=i; pos=smiley; }
}
if(id==10000){ id=-1 }
return {id:id,pos:pos};
}

replaceSmileys = function(txt:TextField){
var t:TextField = txt._parent.createTextField("temporaryTextField",getNextHighestDepth(),0,100,100,100);
t._visible=false; t.embedFonts=true; t.type="dynamic"; t.autoSize=true;
var tf:TextFormat = t.getTextFormat();
tf.font="Ad Lib"; // la meme font que le textfield de base, pensez au linkage.
// en effet le embedFonts oblige de passer par TextFormat et une font de la biblio.
tf.size=txt.getTextFormat().size;
t.setNewTextFormat(tf);
var nextSmiley;
nextSmiley=findNextSmiley(txt.text);
while(nextSmiley.id!=-1){
var s = smileys[nextSmiley.pos];
var i=nextSmiley.id;
t.text=txt.text.substr(0,i);
if(t.text=="") t.text=" ";
var k = t.text.indexOf(chr(13)+chr(13));
if(k!=0){
t.replaceText(k,k+2,chr(13)+"deux");
}
var j=t.textWidth;
var nb13=0;
var k=t.text.indexOf(chr(13));
while(k!=-1){
nb13++;
k=t.text.indexOf(chr(13),k+1);
}
var smile=txt._parent.attachMovie(s.attach,"smile"+txt._parent.getNextHighestDepth(),txt._parent.getNextHighestDepth());
smile._y=txt._y + t.textHeight-smile._height+2*nb13;
var last13=t.text.lastIndexOf(chr(13));
if(last13!=-1) t.text=t.text.substr(last13+1);
smile._x=txt._x+t.textWidth+4;
txt.replaceText(i,i+s.search.length,s.replace)
nextSmiley=findNextSmiley(txt.text);
}
}

// voilà, et en +, on peut l'appeller sur n'importe quel textfield, où qu'il soit.

à+
Messages postés
235
Date d'inscription
mercredi 4 avril 2001
Statut
Membre
Dernière intervention
9 novembre 2007

ok ça fait longtemps mais ce qui me posait problème avec cette très bonne source, c'est que on ne pouvait donc plus sélectionner d'un coup le texte. j'ai regardé ce qui était faisable avec un seul textfield, et en jouant avec un textfield temporaire, textWidth et textHeight, on peut arriver au résultat de 123flashChat :
bon le code est un peu brutal comme ça en commentaire, mais je suis persuadé que ça aidera quelqu'un...

var smileys:Array = new Array();
smileys.push({search:"[;)]",attach:"smiley_wink",replace:" "})
smileys.push({search:"[:)]",attach:"smiley_smile",replace:" "})
// etc ... il suffit de calculer le bon espacement pour votre police

replaceSmileys = function(txt){
var t:TextField = createTextField("temporaryTextField",getNextHighestDepth(),0,100,100,100);
t._visible=false; t.embedFonts=true; t.type="dynamic"; t.autoSize=true;
var tf:TextFormat = t.getTextFormat();
tf.font="myfont"; // la meme font que le textfield de base, pensez au linkage.
// en effet le embedFonts oblige de passer par TextFormat et une font de la biblio.
tf.size=txt.getTextFormat().size;
t.setNewTextFormat(tf);
var baseTexte:String;
for(smiley in smileys){
s=smileys[smiley];
var i=txt.text.indexOf(s.search);
while(i!=-1){
t.text=txt.text.substr(0,i);
var j=t.textWidth;
var nb13=0;
var k=t.text.indexOf(chr(13));
while(k!=-1){ // on compte le nb de saut de lignes dans le textfield
nb13++;
k=t.text.indexOf(chr(13),k+1);
}
var smile=attachMovie(s.attach,"smile"+getNextHighestDepth(),getNextHighestDepth());
smile._y=t.textHeight-smile._height+2*nb13; // un saut de ligne=2pt
var last13=t.text.lastIndexOf(chr(13));
if(last13!=-1) t.text=t.text.substr(last13+1);
smile._x=t.textWidth+4;
txt.replaceText(i,i+s.search.length,s.replace)
i=txt.text.indexOf(s.search);
}
}
}

replaceSmileys(votreTextField);
//pensez à linker des smileys évidemment...
Messages postés
4
Date d'inscription
mardi 28 novembre 2006
Statut
Membre
Dernière intervention
9 juin 2007

Faudrait surtout que Adobe améliore cette balise qui pour le coup, perd bcp de son utilité.
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Membre
Dernière intervention
21 juin 2009
2
Si ils arrivent à faire ça avec un seul textfield, c'est balaise, et ça permet d'alleger au niveau de l'utilisation memoire. parsque faut avouer que ma source est assez lourde apres plusieurs centaines de mots...
Messages postés
311
Date d'inscription
samedi 24 mai 2003
Statut
Membre
Dernière intervention
27 septembre 2014

je pense que 123flashchat utilise la même technique que celle de BW mais il y'a un seul textfield. Les smileys sont chargés dans un clip et placé au dessus du textfield dans lequels ils insèrent plusieurs espaces. La question c'est comment font ils pour pouvoir placer le clip précisement après tel mot.
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.