java - 如何在Android Studio中运行JavaFX并制作ImageView

标签 java android android-studio javafx javafxports

我有一个与 javafx.scene.image.Image 类的接口(interface)。我必须实现它并创建 ImageView。那么,如何将 JavaFx 添加到我的 Android Studio 项目中以及如何在我的 Activity 中执行 ImageView 或其他图像元素?

用户.java

import javafx.scene.image.Image;

    public interface User
    {
        String getName();
        int getId();
        Image getIcon();
    }

最佳答案

基于 JavaFXPorts和 Kokos sample ,您可以将 JavaFX 添加到使用 Android Studio 创建的 Android 项目,并且您将能够在 Android fragment 中运行 JavaFX 场景。

请注意,JavaFXPorts 最初旨在使用纯 Java 在 Android 和 iOS 上运行完整的 JavaFX 项目,而无需 native 代码。反之亦然,但这不是最佳方法。

无论如何,这些是使用 JavaFX ImageView 保存 JavaFX Image 创建 JavaFX 场景的必需步骤。

<强>1。在 Android Studio 上创建一个简单的项目

选择一个Basic Activity模板,并选择使用一个 fragment 。

Add a fragment

<强>2。修改构建 gradle 文件

build.gradle(顶级项目)

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:3.5.0'
        classpath 'com.android.tools.build:gradle:2.2.3'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

build.gradle(模块:应用程序)

在这个文件中,我们将包括 dalvik-sdk,Android 的 JavaFXPorts 依赖项。如果您使用 Java IDE 的 Gluon 插件通过 jfxmobile 插件创建移动项目,您可以找到它安装在:

~/.gradle/caches/modules-2/files-2.1/org.javafxports/dalvik-sdk/8.60.10/e...a/unpacked/dalvik-sdk

否则,可以从here下载。 .将其提取到给定路径,比方说 $dalvikPath

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.3"
    defaultConfig {
        applicationId "gluonhq.com.myfragment"
        minSdkVersion 25
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    dexOptions {
        preDexLibraries = false
        additionalParameters=['--core-library']
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDir file("$dalvikPath/rt/lib")
            assets.srcDirs = ['assets']
        }
    }
    lintOptions {
        abortOnError false
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile fileTree(include: ['*.jar'], dir: '$dalvikPath/rt/lib/ext')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
    compile 'com.android.support:design:26.0.0-alpha1'
    testCompile 'junit:junit:4.12'
}

<强>3。创建一个扩展 FXFragment

的类

MainActivity.java 中:

public static class PlaceholderFragment extends FXFragment {

    public PlaceholderFragment() {
        String fxapp = "your.package.myfragment.MainFX";
        this.setName(fxapp);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

并从 onCreate 调用它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }
    ...
}

请注意 android:id="@+id/container"activity_main.xml 中是必需的。

<强>4。最后一步:创建 JavaFX 类

确保包名称是 your.package.myfragment

MainFX.java

public class MainFX extends Application {

    @Override
    public void start(Stage stage) throws Exception {

        final ImageView imageView = new ImageView();
        imageView.setImage(new Image("https://upload.wikimedia.org/wikipedia/en/c/cc/JavaFX_Logo.png"));
        imageView.setPreserveRatio(true);

        Screen primaryScreen = Screen.getPrimary();
        Rectangle2D visualBounds = primaryScreen.getVisualBounds();
        double width = visualBounds.getWidth();
        double height = visualBounds.getHeight();

        StackPane stackPane = new StackPane(imageView);
        Scene scene = new Scene(stackPane, width, height);

        imageView.fitWidthProperty().bind(scene.widthProperty().subtract(20));
        stage.setScene(scene);
        stage.show();
    }

}

请注意,这是一个纯 JavaFX 应用程序类,您需要根据屏幕边界设置舞台大小。

部署并运行应用

请注意,您将在 Android View 中运行 JavaFX,但根据您的布局,您仍然有其他 Android 组件位于它之上的不同 View 中。

关于java - 如何在Android Studio中运行JavaFX并制作ImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49238603/

相关文章:

Java 和 SWIG : class into a package

java - 为什么这段使用流的代码在 Java 9 中比在 Java 8 中运行得快得多?

android - 在 Android 上将大型位图文件调整为缩放的输出文件

android - 不推荐使用 ActionBarActivity

java - 将 xjc 的 -enableIntrospection 与 jaxws-maven-plugin 一起使用

java - 放入静态 map 时的非静态变量 this

java - 无法在约束布局中以编程方式添加 View

android - 如何更改 android jetpack compose bottomAppBar 图标的颜色?

Android Studio 3.6 总是选择第一个构建变体

android-studio - 如何在 RecyclerView 上使用 LiveData?