Control PointToClient () против PointToScreen ()

Последний код, pls см. link form github

message.setSpan(span, start, end, flags);
blockquote>

Вам нужно удалить начальный интервал перед установкой нового интервала. См. Ниже Функция onClick () для ClickableSpan не работает для URLSpan?

РЕДАКТИРОВАТЬ Вы можете захватить любое событие клика по диапазону extends LinkMovementMethod

    import android.os.Handler;
import android.os.Message;
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.widget.TextView;

import java.lang.ref.WeakReference;

public class LinkMovementMethodExt extends LinkMovementMethod {
    public static final int LinkMovementMethod_Down = 1001;
    public static final int LinkMovementMethod_Up = 2002;
    private static LinkMovementMethod sInstance;
    private Class mSpanClass = null;
    private WeakReference mWeakReference = null;

    public static MovementMethod getInstance(Handler handler, Class spanClass) {
        if (sInstance == null) {
            sInstance = new LinkMovementMethodExt();
            ((LinkMovementMethodExt) sInstance).mWeakReference = new WeakReference<>(handler);
            ((LinkMovementMethodExt) sInstance).mSpanClass = spanClass;
        }
        return sInstance;
    }

    @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();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);
            /**
             * get you interest span
             */
            Object[] spans = buffer.getSpans(off, off, mSpanClass);
            if (spans.length != 0) {
                if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer, buffer.getSpanStart(spans[0]), buffer.getSpanEnd(spans[0]));
                    MessageSpan obj = new MessageSpan();
                    obj.setObj(spans);
                    obj.setView(widget);
                    Handler handler = mWeakReference.get();
                    if (handler != null) {
                        Message message = handler.obtainMessage();
                        message.obj = obj;
                        message.what = LinkMovementMethod_Down;
                        message.sendToTarget();
                        return true;
                    }
                    return false;
                } else if (action == MotionEvent.ACTION_UP) {
                    Handler handler = mWeakReference.get();
                    if (handler != null) {
                        MessageSpan obj = new MessageSpan();
                        obj.setView(widget);
                        Message message = handler.obtainMessage();
                        message.obj = obj;
                        message.what = LinkMovementMethod_Up;
                        message.sendToTarget();
                        return true;
                    }
                    return false;
                }
            }
        }

        return super.onTouchEvent(widget, buffer, event);
    }

    public boolean canSelectArbitrarily() {
        return true;
    }

    public boolean onKeyUp(TextView widget, Spannable buffer, int keyCode,
                           KeyEvent event) {
        return false;
    }

textView.setMovementMethod (LinkMovementMethodExt.getInstance ());


Изменить для «разработчика Android». Это лучший способ добавить свойство Handler для класса LinkMovementMethodExt. Вы можете захватить все Spanned, которые поставляются как объект Message. Снайперский код в методе onTouchEvent:

Message message = Handler.obtainMessage();
message.obj = buffer.getSpans(off, off, Spanned.class);//get all spanned
message.what = 111;//which value ,it is up to you
message.sendToTarget(); //send message to you target handler

Вы можете обработать ожидаемое в вашем классе обработчика. Возможно, это гибкий способ обработки. Надеюсь помочь вам.


enter image description here [/g3]

Над текстом textview aaaa123456bbbb7890 Я понимаю ваше требование: нажмите «aaaa», вы хотите получить его s href value '/a', click 'bbbb',get it s href '/ b'; Не запускайте действие по умолчанию, которое открывается в веб-браузере. Если я правильно понимаю, вы можете сделать следующее:

  • Установить LinkMovementMethod для текстового просмотра и т. Д .: textview.setMovementMethod(LinkMovementMethodExt.getInstance(handler, URLSpan.class));
  • Получить процентный охват, вот URLSpan. В методе handler handleMessage вы можете сделать следующее:
private Handler handler = new Handler() {
      public void handleMessage(Message msg) {
          int what = msg.what;
          if (what == 100) {
              Object[] spans = (Object[])msg.obj;
              for (Object span : spans) {
                  if (span instanceof URLSpan) {
                      System.out.println(((URLSpan) span).getURL());
                  }
              }
          }
      };
  };
blockquote>

Загрузить демонстрационный код

  • Функция MainActivity имеет свойство цвета, которое вы можете назначить, какое значение цвета вы хотите.

Как это сделать?

  • Шаг1, получить текущий
  • Шаг 2, установите BackgroundColorSpan для текущего диапазона кликов

30
задан serhio 16 December 2009 в 10:35
поделиться

4 ответа

Лучший способ думать об этом: относительное против отпущения грехов координаты. Относительная координата отсчитывается от левого верхнего угла клиентской области окна. Клиентская область окна - это окно без границы. Относительные координаты полезны, потому что они не меняются, когда пользователь перемещает окно, и не зависят от границы и размера заголовка окна.

Большинство координат в Winforms являются относительными координатами, например MouseEventArgs.Location. Некоторые из них являются абсолютными, например Cursor.Position. Если вы передадите относительные координаты PointToClient, вы получите мусор, как вы видели в сеансе отладки. Это должна быть абсолютная координата.

Некоторые свойства координат могут казаться обоими, Control. Например, местоположение. В дочернем элементе управления он представляет расположение элемента управления относительно его контейнера. Местоположение формы является абсолютным. Это кажущееся противоречие исчезает, если вы думаете, что Control.Location является относительным по отношению к родительскому элементу элемента управления. Родительский элемент формы - это рабочий стол.

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

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

В дочернем элементе управления он представляет расположение элемента управления относительно его контейнера. Местоположение формы является абсолютным. Это кажущееся противоречие исчезает, когда вы думаете, что Control.Location является относительным по отношению к родительскому элементу элемента управления. Родительский элемент формы - это рабочий стол.

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

Избегайте проблем, передавая только абсолютные координаты в PointToClient и относительные координаты в PointToScreen.

В дочернем элементе управления он представляет расположение элемента управления относительно его контейнера. Местоположение формы является абсолютным. Это кажущееся противоречие исчезает, когда вы думаете, что Control.Location является относительным по отношению к родительскому элементу элемента управления. Родительский элемент формы - это рабочий стол.

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

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

расположение относительно его контейнера. Местоположение формы является абсолютным. Это кажущееся противоречие исчезает, если вы думаете, что Control.Location является относительным по отношению к родительскому элементу элемента управления. Родительский элемент формы - это рабочий стол.

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

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

расположение относительно его контейнера. Местоположение формы является абсолютным. Это кажущееся противоречие исчезает, когда вы думаете, что Control.Location является относительным по отношению к родительскому элементу элемента управления. Родительский элемент формы - это рабочий стол.

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

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

Это кажущееся противоречие исчезает, когда вы думаете, что Control.Location является относительным по отношению к родительскому элементу элемента управления. Родительский элемент формы - это рабочий стол.

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

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

Это кажущееся противоречие исчезает, когда вы думаете, что Control.Location является относительным по отношению к родительскому элементу элемента управления. Родительский элемент формы - это рабочий стол.

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

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

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

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

Обычно используется для сопоставления координат одного элемента управления с другим элементом управления. Сначала сопоставьте абсолютные координаты экрана с помощью control1.PointToScreen () , затем сопоставьте результат с другим элементом управления с помощью control2.PointToClient () . Значение Point изменяется на смещение между элементами управления, независимо от того, кем являются их родители. Делать это любым другим способом очень болезненно.

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

независимо от того, кто их родители. Делать это любым другим способом очень болезненно.

Избегайте проблем, передавая только абсолютные координаты в PointToClient и относительные координаты в PointToScreen.

независимо от того, кто их родители. Делать это любым другим способом очень болезненно.

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

43
ответ дан 27 November 2019 в 23:45
поделиться

Метод PointToClient является обратным методу PointToScreen .

(Если бы он не был таким длинным и повторяющимся, их бы назвали ScreenPointToClientPoint и ClientPointToScreenPoint .)

Вы используете преобразования, когда у вас есть один вид координат и вам нужен другой, например, если у вас есть координаты щелчка мыши относительно экрана, и вам нужно знать, где в элементе управления щелкнул пользователь .

Если вы преобразовываете точку экрана, которая находится за пределами клиентской области, вы получите компоненты координат, которые либо отрицательны, либо больше, чем размер клиентской области управления.

9
ответ дан 27 November 2019 в 23:45
поделиться

Координаты «клиента» отсчитываются относительно верхнего левого угла клиентской области элемента управления. Координаты «экрана» относятся к левому верхнему углу (основного) монитора.

«Клиентская область» - это область элемента управления, в которой могут быть размещены дочерние элементы управления. Клиентский прямоугольник формы - это область внутри формы, за исключением границ и строки заголовка. Для большинства других элементов управления клиентская область такая же, как и область, которую элемент управления занимает на экране.

PointToScreen преобразует координаты клиента в координаты экрана. PointToClient делает обратное: он преобразует координаты экрана в координаты клиента.

4
ответ дан 27 November 2019 в 23:45
поделиться

Предположим, что экран имеет размер 800x600, а окно размером 50,50 имеет размер 200x200 пикселей. Если точка P находится на 10,10 относительно левого верхнего угла окна, то PointToScreen (P) вернет 60,60. Если этот P передан PointToClient (P) с дескриптором окна, то мы снова получим 10,10.

Надеюсь, что это устраняет путаницу

3
ответ дан 27 November 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: