ご存じのとおり、JavaFXPorts プロジェクトを使用すると、JavaFX アプリをデスクトップ、Android、および iOS デバイスにデプロイできます。純粋な JavaFX コードの場合、プロジェクトは Main スコープに追加され、そこからすべてのプラットフォームで表示されます。
プラットフォーム固有のコードが必要な場合にのみ、対応するパッケージに追加する必要があります。
あなたが言及したように、デフォルトでは、メイン パッケージからは、追加されたコードがプラットフォーム パッケージに表示されないため、その方法を提供する必要があります。
JavaFXPorts リポジトリの HelloPlatformサンプルPlatformService
を確認すると、を使用してパッケージをロードするクラスが見つかりますServiceLoader
。
別の可能性はClass.forName()
、アプリが実行されているプラットフォームがわかれば、実行時にクラスを動的にロードすることです。
いくつかのプラットフォーム固有のサービスを管理し、プラットフォームに依存しない統一された API を提供するGluon Downプロジェクトを確認することをお勧めします。
Downでまだ利用できないサービスについては(お気軽に貢献してください)、Gluon Pluginを使用して作成されたこの単純なアプリのように実装できます。
ソースパッケージ [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 パッケージ
vibrate メソッドを追加します。ここでは空のままにしますが、Timeline
たとえば、ボタンを移動するために a を追加できます。
public class GluonDesktopPlatform implements GluonPlatform {
@Override
public void vibrate() {
System.out.println("Vibrating!");
}
}
Android/Java パッケージ
vibrate メソッドを追加します。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
と動作します。