Экстренный прослушиватель на рисованной линии - Java [дубликат]

создайте селектор

<selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@color/primary" android:state_checked="true" />
        <item android:drawable="@android:color/transparent" />
</selector>

и установите

app:itemBackground="@drawable/nav_view_item_background"

, тогда выделенный элемент будет выделен.

, если вы хотите изменить текст затем установите

app:itemTextColor="@drawable/nav_view_item_textcolor"

и создайте для него селектор, как

<selector xmlns:android="http://schemas.android.com/apk/res/android">
      <item android:color="@android:color/white" android:state_checked="true" />
     <item android:color="@color/primary" />
</selector>
2
задан Spoike 25 November 2009 в 15:23
поделиться

4 ответа

Лучший способ сделать это - использовать метод пересечений линии. Как и любой другой упомянутый пользователь, вам нужно иметь буферную область, где они щелкнули. Поэтому создайте прямоугольник, центрированный вокруг вашей координаты мыши, затем проверьте этот прямоугольник для пересечения с вашей линией. Вот некоторый код, который должен работать (у него нет компилятора или чего-то еще, но он должен быть легко модифицируемым)

// Width and height of rectangular region around mouse
// pointer to use for hit detection on lines
private static final int HIT_BOX_SIZE = 2;



public void mousePressed(MouseEvent e) {
    int x = e.getX();
    int y = e.getY();

    Line2D clickedLine = getClickedLine(x, y);
}


/**
* Returns the first line in the collection of lines that
* is close enough to where the user clicked, or null if
* no such line exists
*
*/

public Line2D getClickedLine(int x, int y) {
int boxX = x - HIT_BOX_SIZE / 2;
int boxY = y - HIT_BOX_SIZE / 2;

int width = HIT_BOX_SIZE;
int height = HIT_BOX_SIZE;

for (Line2D line : getLines()) {
    if (line.intersects(boxX, boxY, width, height) {
        return line;
    }       
}
return null;

}

7
ответ дан I82Much 19 August 2018 в 11:14
поделиться
  • 1
    Или просто посмотрите, меньше ли ptLineDist (), чем определенный порог. Таким образом, вы получите менее странные результаты для больших размеров буферов ". – PSpeed 25 November 2009 в 19:59
  • 2
    Хорошее решение - раньше я не слышал о функции ptLineDist. – I82Much 25 November 2009 в 20:28

К сожалению, математика по-прежнему требуется ... Это из java.awt.geom.Line2D:

public boolean содержит (double x, double y)

Тесты, если указанная координата находится внутри границы этой линии2D. Этот метод необходим для реализации интерфейса Shape, но в случае объектов Line2D он всегда возвращает false, так как строка не содержит области.

Указано: содержит в интерфейсе Shape

Параметры : x - координата X указанной точки, подлежащей тестированию; y - координата Y для указанной точки, подлежащей тестированию.

Возвраты: false, поскольку в строке Line2D нет области.

Поскольку : 1.2

Я рекомендую Tojis ответить

0
ответ дан Andreas_D 19 August 2018 в 11:14
поделиться

Ну, во-первых, поскольку математическая линия не имеет ширины, пользователю будет очень сложно щелкнуть точно по линии. Таким образом, лучше всего придумать некоторый разумный буфер (например, 1 или 2 пикселя, или если ваша линия графически использует ширину) и вычислить расстояние от точки щелчка мыши до линии. Если расстояние попадает в ваш буфер, выберите линию. Если вы попали в этот буфер для нескольких строк, выберите тот, который был ближе всего.

Линейные математические данные здесь:

http://mathworld.wolfram.com/Point- LineDistance2-Dimensional.html

Наименьшее расстояние между точкой и отрезком линии

4
ответ дан Community 19 August 2018 в 11:14
поделиться

Если вы используете 2D api, то об этом уже позаботились.

Вы можете использовать класс Line2D.Double для представления строк. Класс Line2D.Double имеет метод contains (), который сообщает вам, находится ли точка в строке или нет.

4
ответ дан Vincent Ramdhanie 19 August 2018 в 11:14
поделиться
  • 1
    Ничего себе, не знал о 2D api. Это api позаботится о множестве других вещей, с которыми у меня были проблемы, прежде чем ... если бы я только знал об этом раньше. (& GT; _ & л;); – Spoike 25 November 2009 в 15:32
  • 2
    .. ты уверен? Когда я прочитал из API, contains() всегда возвращает false, потому что Line2D не имеет области – Andreas_D 25 November 2009 в 15:35
  • 3
    Я думаю, вы все равно можете использовать метод intersect (), если вы используете небольшой прямоугольник в качестве области выделения – Spoike 25 November 2009 в 15:54
  • 4
    Это верно. По определению, contains () не работает с Line2D, но решает, будет ли линия пересекаться с очень маленьким прямоугольником вокруг щелчка. – Vincent Ramdhanie 25 November 2009 в 15:57
  • 5
    Есть ли способ сделать область выделения толстой, как ширина штриха? – retrovius 17 December 2017 в 19:28
Другие вопросы по тегам:

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