создайте селектор
<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>
Лучший способ сделать это - использовать метод пересечений линии. Как и любой другой упомянутый пользователь, вам нужно иметь буферную область, где они щелкнули. Поэтому создайте прямоугольник, центрированный вокруг вашей координаты мыши, затем проверьте этот прямоугольник для пересечения с вашей линией. Вот некоторый код, который должен работать (у него нет компилятора или чего-то еще, но он должен быть легко модифицируемым)
// 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;
}
К сожалению, математика по-прежнему требуется ... Это из java.awt.geom.Line2D:
public boolean содержит (double x, double y)
Тесты, если указанная координата находится внутри границы этой линии2D. Этот метод необходим для реализации интерфейса Shape, но в случае объектов Line2D он всегда возвращает false, так как строка не содержит области.
Указано: содержит в интерфейсе Shape
Параметры : x - координата X указанной точки, подлежащей тестированию; y - координата Y для указанной точки, подлежащей тестированию.
Возвраты: false, поскольку в строке Line2D нет области.
Поскольку : 1.2
blockquote>Я рекомендую Tojis ответить
Ну, во-первых, поскольку математическая линия не имеет ширины, пользователю будет очень сложно щелкнуть точно по линии. Таким образом, лучше всего придумать некоторый разумный буфер (например, 1 или 2 пикселя, или если ваша линия графически использует ширину) и вычислить расстояние от точки щелчка мыши до линии. Если расстояние попадает в ваш буфер, выберите линию. Если вы попали в этот буфер для нескольких строк, выберите тот, который был ближе всего.
Линейные математические данные здесь:
http://mathworld.wolfram.com/Point- LineDistance2-Dimensional.html
Если вы используете 2D api, то об этом уже позаботились.
Вы можете использовать класс Line2D.Double для представления строк. Класс Line2D.Double имеет метод contains (), который сообщает вам, находится ли точка в строке или нет.
contains()
всегда возвращает false, потому что Line2D
не имеет области
– Andreas_D
25 November 2009 в 15:35