3

JavaFX を Android に移植するための Gluon プラグイン (Netbeans 8.0.2) の gradle ビルドは、次のディレクトリ構造を作成します。

  1. ソースパッケージ [Java]
  2. Android/Java パッケージ
  3. デスクトップ/Java パッケージ
  4. iOS/Java パッケージ

これらの各ディレクトリには、Java パッケージが含まれています。通常、Gluon ビルドは、「ソース パッケージ」ディレクトリ内の 1 つの Java パッケージに「メイン」クラスを作成します [「ソース パッケージ」を含むパッケージという名前は、Java パッケージではなく、単なるファイル システム ディレクトリであるため、誤解を招く可能性があります]。このメイン クラスは Javafx Application クラスを拡張するため、アプリケーションへのエントリ ポイントになります。

Android API は、その内部で作成された Java パッケージの Android/Java Packages ディレクトリでのみアクセスできます。たとえば、android.Vibrator クラスはここでのみ参照可能です。

問題は、Android/Java ディレクトリ内の Java パッケージ内で作成されたクラスを、Source Packages [Java] ディレクトリ内で作成された Java パッケージに参照できないことです!! この場合、どのようにしてアプリケーションを javafx.Application の start() メソッドから android.Vibrator に進めますか?

gluon プロジェクト構造のスナップショットは次の場所にあります: How to reference android.jar in Gluon Project

4

1 に答える 1

2

ご存じのとおり、JavaFXPorts プロジェクトを使用すると、JavaFX アプリをデスクトップ、Android、および iOS デバイスにデプロイできます。純粋な JavaFX コードの場合、プロジェクトは Main スコープに追加され、そこからすべてのプラットフォームで表示されます。

プラットフォーム固有のコードが必要な場合にのみ、対応するパッケージに追加する必要があります。

あなたが言及したように、デフォルトでは、メイン パッケージからは、追加されたコードがプラットフォーム パッケージに表示されないため、その方法を提供する必要があります。

JavaFXPorts リポジトリの HelloPlatformサンプルPlatformServiceを確認すると、を使用してパッケージをロードするクラスが見つかりますServiceLoader

別の可能性はClass.forName()、アプリが実行されているプラ​​ットフォームがわかれば、実行時にクラスを動的にロードすることです。

いくつかのプラットフォーム固有のサービスを管理し、プラットフォームに依存しない統一された API を提供するGluon Downプロジェクトを確認することをお勧めします。

Downでまだ利用できないサービスについては(お気軽に貢献してください)、Gluon Pluginを使用して作成されたこの単純なアプリのように実装できます。

ソースパッケージ [Java]

まず、getPlatform()メソッドを作成し、参照されるクラスを特定のプラットフォームごとに追加します。たとえば、org.gluonoss.vibrator.GluonAndroidPlatform.javaAndroid パッケージを追加します。

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 メソッドを追加します。FXActivityJavaFX スレッドと 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と動作します。

于 2015-08-30T12:24:59.350 に答える