Как получить ограничивающий прямоугольник для текущего выбора?

Я хотел бы сделать модные вещи, индикатор выбора. Как получить ограничивающий прямоугольник для выбранных в данный момент символов?

2 ответа

Решение

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

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

        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

[Style(name="focusTextSelectionColor", type="uint", format="Color", наследовать = "yes")]

[Style (name = "inactiveTextSelectionColor", type="uint", format="Color", наследовать = "yes")]

[Style (name = "unfocusedTextSelectionColor", type="uint", format="Color", наследовать = "да")]

также отметить:

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

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

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

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

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

Shaun

Другие вопросы по тегам