Здравствуйте Анатолий. Вы писали
> А как вам удается вычислить экранные координаты для двойного tap (точнее,
> для двух быстрых tap), используя индекс символа в текстовом фрагменте?
Там как раз наоборот,они вычисляют ссылку по координатам и это для нас
недоступно. Там,конечно,ещё обрабатывают клик по изображению,но
поскольку я не где этого в квестах не встречал,и всё равно клик по
картинке в html,к сожалению,не доступен для нас,я решил не
заморачиваться. Если честно,я не понял,как это работает,но они это
делают так (в прошлом сообщении я ошибся,поскольку наследник класса
qspLinkMovementMethod ScrollingMovementMethod):
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer,
MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
//Если не попали точно в символ, относящийся к ссылке,
проверяем 8 соседних
int[] dy = {0, -1, 1, 0, 0, -1, 1, 1, -1};
int[] dx = {0, 0, 0, -1, 1, -1, 1, -1, 1};
int line;
int off;
URLSpan[] link = null;
ImageSpan[] images = null;
for (int i=0; i<9; i++)
{
line = layout.getLineForVertical(y) + dy[i];
if ((line < 0) || (line > layout.getLineCount() - 1))
continue;
off = layout.getOffsetForHorizontal(line, x) + dx[i];
link = buffer.getSpans(off, off, URLSpan.class);
if (link.length != 0) break;
images = buffer.getSpans(off, off, ImageSpan.class);
if (images.length != 0) break;
}
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
urlCatcher.OnUrlClicked(link[0].getURL());
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
return true;
} else if (images.length != 0) {
if (action == MotionEvent.ACTION_UP) {
urlCatcher.OnImageClicked(images[0].getSource());
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(images[0]),
buffer.getSpanEnd(images[0]));
}
return true;
} else {
Selection.removeSelection(buffer);
}
}
return super.onTouchEvent(widget, buffer, event);
}
Подробнее на этот проект можно посмотреть gпо ссылке,которую я давал в
прошлом письме. Ещё Вы пишете
> И в чем проблема? У класса Activity есть метод onNewIntent(), который
> вызывается системой, если новый интент приходит в уже работающую
> активность.
Да,Вы правы. Я забыл про эту возможность. Правда этот метод вызывается
по-моему только при режиме запуска activity singleInstance и singleTop.
Посоветуйте пожалуйста,какой из режимов запуска мне лучше
предпочесть,т.е какое значение лучше всего прописать в манифесте для
атрибута activity lounchMode (название атрибута может быть написана
неточно)? Ещё Вы пишете
> А в соответствующем intent-filter пропишите правильную атрибут
> android:schemeтребуемой ссылки (то есть не http, а exec).
Ну раз так сработает,то это хорошо. Просто я считал,что это не будет
работать без //. А ведь в проекте ссылки начинаются с exec: а не с
exec://. Ещё хотелось бы узнать как Вы предлагаете обрабатывать двойной
клик,ведь в обработчике onclick мы не знаем не индекса в строке,т.е
индекс символа в строке,под курсором которого находится talkback,не
координат view,по которому мы кликаем. Мы только знаем само view,по
которому мы кликаем. Заранее благодарю Вас за помощь.