Хотелось бы сделать причудливые индикаторы выбора. Как получить ограничительную рамку для выбранных в данный момент символов?Как получить ограничительную рамку для текущего выбора?
ответ
Это было нетривиально. Во-первых, для выбора может потребоваться более одного прямоугольника. Затем нет удобного способа сделать это.
Вот что я должен был сделать:
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;
Я не верю, что есть тривиальный способ получить полный контроль над этим, из оглядывая документации немного, я увидел это: 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