Как вы знаете, проект JavaFXPorts позволяет развертывать приложения JavaFX на устройствах Desktop, Android и iOS. Когда это просто чистый код JavaFX, проект добавляется в область действия Main, и оттуда он будет виден на всех этих платформах.
Только в том случае, если вам нужен код для конкретной платформы, вы должны добавить его в соответствующий пакет.
Как вы упомянули, по умолчанию из пакета Main вы не увидите добавленный код в пакете платформы, поэтому вы должны предоставить способ для этого.
Если вы посмотрите пример HelloPlatform в репозитории JavaFXPorts, вы найдете класс PlatformService
для загрузки пакетов с помощью ServiceLoader
.
Другая возможность — использовать Class.forName()
для динамической загрузки классов во время выполнения, как только мы узнаем платформу, на которой работает приложение.
Я предлагаю вам взглянуть на проект Gluon Down, который управляет несколькими службами для конкретных платформ. , и предоставляет вам единый, независимый от платформы API.
Для тех сервисов, которые еще не доступны в Down (не стесняйтесь вносить свой вклад), вы можете реализовать их как в этом простом приложении, созданном с помощью плагина Gluon.
Исходные пакеты [Java]
Сначала создайте метод getPlatform()
и добавьте указанные классы для каждой конкретной платформы. Например, добавьте org.gluonoss.vibrator.GluonAndroidPlatform.java
в пакет Android.
public class GluonPlatformFactory {
public static GluonPlatform getPlatform() {
try {
String platform = System.getProperty("javafx.platform", "desktop");
String path = "org.gluonoss.vibrator.GluonDesktopPlatform";
if(platform.equals("android")) {
path = "org.gluonoss.vibrator.GluonAndroidPlatform";
} else if(platform.equals("ios")) {
path = "org.gluonoss.vibrator.GluonIosPlatform";
}
return (GluonPlatform) Class.forName(path).newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
System.out.println("Platform Error "+e.getMessage());
}
return null;
}
}
Теперь создайте интерфейс с помощью метода, который вы хотите использовать на всех своих платформах:
public interface GluonPlatform {
void vibrate();
}
Наконец, в вашем основном классе извлеките платформу и вызовите свой метод:
@Override
public void start(Stage stage) {
final Button button = new Button("Click me!");
button.setOnAction(e-> GluonPlatformFactory.getPlatform().vibrate());
StackPane root = new StackPane(button);
Rectangle2D visualBounds = Screen.getPrimary().getVisualBounds();
Scene scene = new Scene(root, visualBounds.getWidth(), visualBounds.getHeight());
stage.setScene(scene);
stage.show();
}
Пакеты для рабочего стола/Java
Добавьте метод вибрации. Пока оставьте его пустым, но вы можете добавить Timeline
, например, для перемещения кнопки.
public class GluonDesktopPlatform implements GluonPlatform {
@Override
public void vibrate() {
System.out.println("Vibrating!");
}
}
Пакеты Android/Java
Добавьте метод вибрации. Обратите внимание, что мы должны использовать FXActivity
, который является мостом между потоком JavaFX и активностью Android.
public class GluonAndroidPlatform implements GluonPlatform {
@Override
public void vibrate() {
Vibrator v = (Vibrator) FXActivity.getInstance().getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(500);
}
}
Не забудьте добавить необходимое разрешение в файл AndroidManifest (вы найдете его в разделе src/android/AndroidManifest.xml
.
Теперь вы можете развернуть проект и запустить его на рабочем столе (gradlew run
), и он будет работать, и установить его на Android (gradlew androidInstall
), и он тоже будет работать.
person
José Pereda
schedule
30.08.2015