Я пытаюсь создать экран справки, который будет проходить на медиаплеере. Идея состоит в том, чтобы добавить фрагмент с прозрачной темой поверх текущего представления. (См. Как создать наложение справки, как вы видите в нескольких приложениях для Android и ICS? Для основной идеи). Теперь я понимаю шаги в упомянутой ссылке, но как я могу связать круги и стрелки и абзацы рядом с каждым (объясняя, что каждый из них) для нижнего объекта? Например, у меня есть объект:
R.id.music_button
и я хочу, чтобы там была стрелка, указывающая на кнопку музыки. Пытаясь поддерживать столько устройств, сколько мы делаем, будет очень сложно просто нарисовать несколько снимков как часть верхнего макета и ожидать, что они выстроятся в линию. Опять же, как мне привязать объект к фрагменту ниже верхнего уровня?
благодаря
Обновление 1: После консультаций с Nobu Games я сохранил местоположение и передал его фрагменту справки.
View helpedButton = getView().findViewById(R.id.my_sources_button);
int[] location = { 0, 0 };
helpedButton.getLocationOnScreen(location);
Я думаю, что это правильно, но теперь я не могу получить стрелу:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_help_main_menu, container, false);
DebugLog.d(TAG, "View v is: " + v);
RelativeLayout mainHelp = (RelativeLayout) v.findViewById(R.id.mainHelpLayout);
DebugLog.d(TAG, "Layout is: " + mainHelp);
ImageView arrow = new ImageView(getActivity());
arrow.setX(location[0]);
arrow.setY(location[1]);
arrow.setImageResource(R.drawable.arrow1);
arrow.setVisibility(arrow.VISIBLE);
DebugLog.d(TAG, "Location x: " + location[0]);
DebugLog.d(TAG, "Location y: " + location[1]);
arrow.bringToFront();
DebugLog.d(TAG, "CIRCLE " + arrow);
mainHelp.addView(arrow);
return v;
}
ОБНОВЛЕНИЕ 2 Использование getLocationOnScreen и getLocationInWindow приносит мне странные результаты. Кнопка, которую я пытаюсь нарисовать стрелкой, также находится в правом нижнем углу экрана с некоторым дополнением внизу и справа. Координаты, которые я получаю, - x = 1319 и 716 на Sony GTV. Если я использую
LayoutParams params = new RelativeLayout.LayoutParams(60, 40);
params.topMargin = y;
params.leftMargin = x;
Стрела рисует, но в некоторых забавных местах. Я могу использовать математику или изменять параметры до тех пор, пока она не будет выглядеть хорошо в одном представлении, но это только первая из многих стрелок, и многие устройства должны поддерживаться. Мне действительно нужно просто передать расположение кнопки и не рисовать в фанки.
Если я правильно вас понимаю, вы пытаетесь наложить полупрозрачный экран справки поверх вашего фрагмента. Этот оверлей иллюстрирует элементы пользовательского интерфейса в представлении "Фрагмент" ниже.
Для этого есть две возможности:
Опция 1
Перед запуском экрана справки Fragment/Activity вам нужно получить информацию о позиции всех элементов вида, для которых вы хотите предоставить помощь.
Для этого вы можете использовать View.getLocationOnScreen.
Затем передайте данные местоположения вместе с идентификатором для каждого элемента пользовательского интерфейса на экран справки. Например, дополнительные значения Intent.
Ваш компонент помощи должен принимать эти координаты и вычислять абсолютные позиции ваших стрелок.
Вариант 2
Создайте XML файл макета справки, который имеет те же выравнивания и размеры, что и ваш фрагмент. Используйте этот макет справки, чтобы правильно позиционировать ваши метки и стрелочную графику. Используйте поля /paddings для позиционирования этих элементов.