Как запустить JavaFX в Android Studio и сделать ImageView

У меня есть интерфейс с классом javafx.scene.image.Image. Я должен реализовать это и создать ImageView. Итак, как добавить JavaFx в мой проект Android Studio и как сделать ImageView или другой элемент изображения в моей деятельности?

User.java

import javafx.scene.image.Image;

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

@fabian Да, можно ... Смотрите проект Kokos здесь.

José Pereda 12.03.2018 16:34

@fabian Могу ли я преобразовать javafx.scene.image.Image в ImageView, чем?

Hitrene 12.03.2018 16:37

@ JoséPereda круто, но могу ли я преобразовать javafx.scene.image в ImageView. В примере, который вы только что отправили, нет информации об ImageView.

Hitrene 12.03.2018 16:56

В этом примере вы видите, как добавить узел JavaFX во фрагмент Android. Говоря ImageView, вы имеете в виду ImageView от Android? Обратите внимание, что изображение JavaFX должно отображаться в узле JavaFXImageView.

José Pereda 12.03.2018 17:12

@ JoséPereda Ага, ImageView для Android. Я понял этот код. Но как я могу добавить javaFX в свой проект? Я добавил org.javafxports: jfxmobile-plugin: dependency, но User.class все еще не видит javaFX

Hitrene 12.03.2018 17:38

Во-первых, спросите себя, действительно ли вам нужен JavaFX в вашем проекте Android, просто для работы с изображением JavaFX, которое создается из локального или удаленного ресурса. Возможно, вам все-таки не нужен этот образ, и вы можете использовать правильный образ Android?

José Pereda 12.03.2018 17:44

@ JoséPereda это тестовое задание на вакансию. Буду рад, если б ей не пришлось пользоваться, правда)

Hitrene 12.03.2018 17:51

Проблема с использованием JavaFX заключается в том, что вам понадобится полная сцена / этап, просто отобразите ImageView ... Конечно, это можно сделать, но это кажется излишним. Как прокомментировал Фабиан, имеет смысл запускать полный проект JavaFX на Android (и iOS), но не очень часто запускать полный проект Android с фрагментом JavaFX.

José Pereda 12.03.2018 17:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
8
9 372
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основе JavaFXPorts и Kokos образец вы можете добавить JavaFX в проект Android, созданный с помощью Android Studio, и вы сможете запускать сцену JavaFX внутри фрагмента Android.

Обратите внимание, что JavaFXPorts изначально предназначен для запуска полных проектов JavaFX на Android и iOS с использованием простой Java без собственного кода. Можно сделать наоборот, но это не лучший подход.

В любом случае, это необходимые шаги для создания сцены JavaFX с JavaFX ImageView для хранения JavaFX Image.

1. Создайте простой проект в Android Studio.

Выберите шаблон Basic Activity и выберите использование фрагмента.

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, зависимость JavaFXPorts для Android. Если вы используете подключаемый модуль Gluon для своей Java IDE для создания мобильных проектов с подключаемым модулем jfxmobile, вы можете найти его установленным в:

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

В противном случае его можно скачать с здесь. Извлеките его по заданному пути, скажем, $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, и вам необходимо установить базовый размер рабочей области на границах экрана.

Разверните и запустите приложение

Обратите внимание, что у вас будет JavaFX, работающий в представлении Android, но у вас все еще есть другие компоненты Android в разных представлениях поверх него, в зависимости от вашего макета.

Другие вопросы по теме