У меня есть интерфейс с классом 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 Могу ли я преобразовать javafx.scene.image.Image в ImageView, чем?
@ JoséPereda круто, но могу ли я преобразовать javafx.scene.image в ImageView. В примере, который вы только что отправили, нет информации об ImageView.
В этом примере вы видите, как добавить узел JavaFX во фрагмент Android. Говоря ImageView, вы имеете в виду ImageView от Android? Обратите внимание, что изображение JavaFX должно отображаться в узле JavaFXImageView.
@ JoséPereda Ага, ImageView для Android. Я понял этот код. Но как я могу добавить javaFX в свой проект? Я добавил org.javafxports: jfxmobile-plugin: dependency, но User.class все еще не видит javaFX
Во-первых, спросите себя, действительно ли вам нужен JavaFX в вашем проекте Android, просто для работы с изображением JavaFX, которое создается из локального или удаленного ресурса. Возможно, вам все-таки не нужен этот образ, и вы можете использовать правильный образ Android?
@ JoséPereda это тестовое задание на вакансию. Буду рад, если б ей не пришлось пользоваться, правда)
Проблема с использованием JavaFX заключается в том, что вам понадобится полная сцена / этап, просто отобразите ImageView ... Конечно, это можно сделать, но это кажется излишним. Как прокомментировал Фабиан, имеет смысл запускать полный проект JavaFX на Android (и iOS), но не очень часто запускать полный проект Android с фрагментом JavaFX.




На основе JavaFXPorts и Kokos образец вы можете добавить JavaFX в проект Android, созданный с помощью Android Studio, и вы сможете запускать сцену JavaFX внутри фрагмента Android.
Обратите внимание, что JavaFXPorts изначально предназначен для запуска полных проектов JavaFX на Android и iOS с использованием простой Java без собственного кода. Можно сделать наоборот, но это не лучший подход.
В любом случае, это необходимые шаги для создания сцены JavaFX с JavaFX ImageView для хранения JavaFX Image.
1. Создайте простой проект в Android Studio.
Выберите шаблон Basic Activity и выберите использование фрагмента.
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 в разных представлениях поверх него, в зависимости от вашего макета.
@fabian Да, можно ... Смотрите проект Kokos здесь.