2009-08-03 24 views
5

Ben bir bağlantı html metni gösteren bir metin alanında 'süpürdü' olduğunda öğrenmek için çalışıyorum içinde Link üzerinden 'Gelindiğinde' dinleniyor. Bir imleç dinlemeyi değiştirmenin bir tür olay olabileceğini merak ediyorum. Dokümanlarda hiçbir şey bulamıyorum. Burada hangi etkinliği dinleyebileceğimi bilen var mı?Flex: metin alanına

Teşekkürler

+0

siz "Flex" biraz "HTML" yolunu ... –

cevap

3

. Cay'ın önerisini kullanarak, metnin konumlarına karşılık gelen Array nesnesini döndürecek bir yöntem düşünmüştüm. Çoğul kullanıyorum çünkü metin kelimesi kısıldıysa çoklu dikdörtgenler gerekebilir.

var field:TextField = new TextField(); 
this.addChild(field); 
// move the text field to some random coordinates 
field.x = 50; 
field.y = 50; 
// set wordwrap to true, to test the multiline behaviour of our function 
field.wordWrap = true; 
// set a smaller width than our text 
field.width = 300; 
// disable selectability, I'm not sure it would work properly, anyway 
field.selectable = false; 
// fill the textfield with some random html text 
field.htmlText = 'Lorem ipsum dolor sit amet, consectetur adipiscing <a href="http://www.stackoverflow.com">elit. Aliquam et</a> elementum lorem. Praesent vitae nunc at mi venenatis auctor.'; 

Şimdi, bir olay dinleyicisi sahip olmak için, biz bir nesne oluşturmak gerekir ve gerçek metnin üzerine dikdörtgenler çizmek:

function getPhraseLocation(phrase:String, field:TextField):Array { 
    // initialise the return array 
    var locations:Array = new Array(); 
    // find the first and last chars 
    var firstChar = field.text.indexOf(phrase); 
    var lastChar = firstChar+phrase.length; 
    // determine the bounding rectangle of the first char 
    var firstCharRect = field.getCharBoundaries(firstChar); 
    var crtLocation:Rectangle = new Rectangle(firstCharRect.left,firstCharRect.top,firstCharRect.width,firstCharRect.height); 
    // while there are chars left in the string 
    var crtChar:uint = firstChar; 
    while (++crtChar<lastChar) 
     // if they're on the same line, expand the current rectangle 
     if (field.getCharBoundaries(crtChar).y==crtLocation.y) crtLocation.width = uint(crtLocation.width)+field.getCharBoundaries(crtChar).width; 
     // if they're on the next line, due to word wrapping, create a new rectangle 
     else { 
      locations.push(crtLocation); 
      var crtCharRect = field.getCharBoundaries(crtChar); 
      crtLocation = new Rectangle(crtCharRect.left,crtCharRect.top,crtCharRect.width,crtCharRect.height); 
     } 
    // add the last rectangle to the array 
    locations.push(crtLocation); 
    // return the array 
    return(locations); 
} 

en böylece gibi TextField oluşturulan varsayalım. Dikdörtgenler% 0 alfa ile çizilir, böylece görünmezdir.

// create a sprite and add it to the display list 
var overlay:Sprite = new Sprite(); 
this.addChild(overlay); 
// enable mouse actions on it and make the cursor change on hover 
overlay.mouseEnabled = true; 
overlay.buttonMode = true; 
// call the function that returns the size and position of the bounding boxes 
var locationArray:Array = getPhraseLocation('elit. Aliquam et',field); 
// draw each rectangle in white transparent fill 
for each (var bounds:Rectangle in locationArray) { 
    overlay.graphics.beginFill(0xff0000,0); 
    overlay.graphics.drawRect(bounds.x+field.x-overlay.x, bounds.y+field.y-overlay.y, bounds.width, bounds.height); 
    overlay.graphics.endFill(); 
} 

Sonra MouseOver için olay dinleyicisi ekleyin:

overlay.addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler); 
function mouseOverHandler(evt:MouseEvent):void { 
    trace('mouse over key phrase'); 
    // do whatever else you want to do 
} 

Maalesef gerçek metnin üzerinde bir şey çizmek, çünkü linkler pasif olur. Böylece biz de, tıklama için olay dinleyicileri eklemek gerekir:

overlay.addEventListener(MouseEvent.CLICK, clickHandler); 
function clickHandler(evt:MouseEvent):void { 
    navigateToURL(new URLRequest('http://www.stackoverflow.com')); 
} 

o olurdu olarak daha önce, fare tam davranmak, onun imleci değişecektir true için buttonMode özelliğini ayarlamak için metnindeki bağlantı olur eğer çalıştı.

ben anlamak daha kolay kod tutmak için, değişkenler çok tanımladık. Kod kısaltılabilir ve optimize edilebilir, ancak olduğu gibi iyi çalışmalıdır.

Bu görevlerin en basit için geçici bir çözüm cehennemi, ama işe yarıyor. Umarım kullanıcıdır.

+0

Teşekkürler - yardım için teşekkür ederiz. – Chin

+0

Rica ederim. :) – evilpenguin

+0

bindirme, her mektubu kapsayacak gibi görünmüyor, ama her nasılsa mükemmel bir çözüm! – Hwang

1

AFAIK bu mümkün değil. CSS'yi rollover üzerindeki bağlantıyı (kendi başına başka bir acı) şekillendirmek için kullanabilirsiniz, ancak rollover'ı bir AS olayı olarak yakalayamazsınız. LINK olayını kullanarak bir bağlantının tıklamasını yakalayabilirsiniz.

+0

teşekkür yapmaya çalıştığınızda bu bir ağrı hazırdır. Bende böyle düşünmüştüm. Hmmm ... İmleç değiştiğinde dinlemenin bir yolu olup olmadığını merak ediyorum. – Chin

+0

Farenin değiştiğini duyabileceğimi sanmıyorum (ve neredeyse bir hayır olduğu kesin.) Burada [fare olayları] içinde yerleşik bir liste var (http://livedocs.adobe.com/flash/ 9.0/ActionScriptLangRefV3/flash/events/MouseEvent.html) ve aradığınızı içermiyor. –

2

Dinleyicileri atayamazsınız, ancak bir çözüm olarak, farenin konumunu kontrol edebilir ve metnin bir kısmını ne zaman harcadığını belirleyebilirsiniz ... Bağın dikdörtgeni belirledikten sonra (bkz. TextField.getCharBoundaries ()) olayları dinlemek için küçük bir hareketli grafik oluşturabilir veya dikdörtgenin enterFrame üzerinde Point (mouseX, mouseY) içerip içermediğini kontrol edebilirsiniz. Çok ilginç bir problem

1

Sen TextEvent.LINK olayını kullanabilirsiniz. Mobil appclications için uygulanmasını takip edin:

while(html.search("http://") != -1){ 
    html = html.replace("http://.", "event:"); 
    //it's necessary that the link contains the tag "event:" to the TextEvent.LINK event works. 
} 
StyleableTextField(textArea.textDisplay).htmlText = html; 
StyleableTextField(textArea.textDisplay).addEventListener(TextEvent.LINK, link_clickHandler); 
private function link_clickHandler(event:TextEvent):void 
{ 
    var url:String = "http://" + event.text; 
    // event.text contains the clicked URL 
} 
İlgili konular