2011-01-25 5 views

ответ

1

Это было нетривиально. Во-первых, для выбора может потребоваться более одного прямоугольника. Затем нет удобного способа сделать это.

Вот что я должен был сделать:

 var start:int = op.activePosition < op.anchorPosition ? op.activePosition : op.anchorPosition; 
     var end:int = op.activePosition > op.anchorPosition ? op.activePosition : op.anchorPosition; 

     var textFlow:TextFlow = this.textFlow; 
     var rectangles:Dictionary = new Dictionary(); 

     // For each selected character, make a box 
     for(var i:int=start; i < end; i++) { 

      var flowLine:TextFlowLine = textFlow.flowComposer.findLineAtPosition(i, true); 

      if(rectangles[ flowLine.absoluteStart ] == null) { 
       rectangles[ flowLine.absoluteStart ] = new Rectangle(); 
       (rectangles[ flowLine.absoluteStart ] as Rectangle).x = 0xffffff; 
       (rectangles[ flowLine.absoluteStart ] as Rectangle).right = 0; 
      } 
      var currentRect:Rectangle = rectangles[ flowLine.absoluteStart ]; 

      var textLine:TextLine = flowLine.getTextLine(true); 
      var atomIndex:int = textLine.getAtomIndexAtCharIndex(i); 
      if(atomIndex >= 0) { 
       var atomBounds:Rectangle = textLine.getAtomBounds(atomIndex); 

       var pt:Point = this.globalToLocal(textLine.localToGlobal(new Point(atomBounds.left, atomBounds.top)));      
       if(pt.x <= currentRect.left) { 
        currentRect.left = pt.x; 
        currentRect.top = pt.y; 
       } 

       pt = this.globalToLocal(textLine.localToGlobal(new Point(atomBounds.right, atomBounds.bottom))); 
       if(pt.x >= currentRect.right) { 
        currentRect.right = pt.x; 
        currentRect.bottom = pt.y; 
       }     
      } 
     } 
     return rectangles; 
0

Я не верю, что есть тривиальный способ получить полный контроль над этим, из оглядывая документации немного, я увидел это: http://opensource.adobe.com/wiki/display/flexsdk/Spark+Text+Primitives#SparkTextPrimitives-FTE

[Style (имя = «focusedTextSelectionColor», тип =» UINT», формат = "Color", наследуйте = "да")]

[Style (имя = "inactiveTextSelectionColor", тип = "UINT", формат = "Color", наследуйте = "да")]

[Стиль (name = "unocusedTextSelectionColor", type = "uint", format = "Color", inherit = "yes")]

также обратите внимание:

позиция привязки - индекс символа, указывающий конец выбора, который остается фиксированным, когда вы расширяете выделение с помощью клавиш со стрелками.

активная позиция - индекс символа, указывающий конец выбора, который перемещается при продлении выделения клавишами со стрелками.

Поскольку все это только цвета (или индексы), я не знаю, смогут ли они получить всю причудливость, которую вы хотели бы сделать. Я работал над чем-то в Flex 3, чтобы иметь дело с пользовательскими элементами управления выбором текста и в конечном итоге использовал «буфер вне экрана», где я помещал TextField вне экрана с теми же свойствами, что и на экране, а затем сбрасывал символы 1 на 1 пока я не добрался до нужной ширины, я мог бы выяснить, где в персонажах элемент управления был сброшен (вроде андроида).

Я предлагаю выполнить поиск вышеуказанных стилей в SDK, который у вас есть (в частности, в RichEditableText и его суперклассах, я бы сделал это, но там есть довольно много версий и не знаю, какой из них вы используете, TLF и FTE оба немного в потоке, похоже). Как только вы найдете, где используются эти стили, вы, вероятно, будете находиться рядом с кодом рисования индикатора выбора, и, вероятно, вам придется расширять его из любого класса, чтобы переопределить соответствующие методы.

Извините, я не могу дать вам прямой ответ, но, надеюсь, это поможет, или кто-то другой сможет перезвонить, если есть более простой способ.

Shaun

Смежные вопросы