2017-09-21 5 views
0

私は自分のjava fxプロジェクトの1つをgluonを使ってアンドロイドに変換しようとしていました。それは画像ビューアなどを実装する場面なので、私はすべてのファイルがアクセス可能であることを期待していましたが、ファイルをどこに置いてもパスとして置いてもMediaを使用すると、アプリケーションに.wav私のプロジェクトのファイル。私は自分の.wavファイルをどこに置くべきか、そしてコードのMedia( "")部分のURlとして何を使うべきかについていくつかの助けを得ることができるかどうか疑問に思っていました。私は芸術44.475 29162 29167:javafxports javafx.scene.media.ビルド後のメディアファイルのパス

9月22日16:28、これは完全なログ猫であるあなた

package com.junhong.faceclickb; 

import com.gluonhq.charm.down.Services; 
import com.gluonhq.charm.down.plugins.VideoService; 

import javafx.animation.AnimationTimer; 
import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.geometry.Bounds; 
import javafx.scene.Group; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.ToolBar; 
import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.input.MouseButton; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class Graphics extends Application { 
    BorderPane borderPane = new BorderPane(); 
    ToolBar toolbar = new ToolBar(); 
    Group root = new Group(); 
    Scene scene = new Scene(root); 
    Score score = new Score(0); 
    Text generation = new Text("Score: " + score.getScore()); 
    private Animate animate = new Animate(); 
    private ImageView img = new ImageView(); 
    Face face; 
    Bounds bounds = borderPane.getBoundsInLocal(); 
    double dx = 5; 
    double dy = 5; 

    public static void main(String[] args) { 

     launch(args); 
    } 

    public Parent createContent() { 
     // // top 
     HBox top = new HBox(); 
     top.getChildren().add(generation); 
     borderPane.setTop(top); 
     // face 
     face = new Face("normalFace.png"); 
     EventHandler myMouseEvent = new myMouseEvent(); 
     img.setImage(new Image(face.getImgName())); 
     img.setOnMousePressed(myMouseEvent); 
     borderPane.setCenter(img); 
     return borderPane; 
    } 

    private void setRandomDx() { 
     dx = (int) (Math.random() * 20); 
    } 

    private void setRandomDy() { 
     dy = (int) (Math.random() * 20); 
    } 

    // private void directionMove(ImageView img, double speed, double direction) { 
    // dx = face.getXValue() + Math.cos(direction * (Math.PI/180)) * speed; 
    // dy = face.getYValue() + Math.sin(direction * (Math.PI/180)) * speed; 
    // moveImg(img, dx, dy); 
    // 
    // } 

    private void speedImg(ImageView img, double dx, double dy) { 
     borderPane.getChildren().remove(img); 
     face.setXValue(face.getXValue() + dx); 
     face.setYValue(face.getYValue() + dy); 
     img.setX(face.getXValue()); 
     img.setY(face.getYValue()); 
     borderPane.getChildren().add(img); 
    } 

    @Override 
    public void start(Stage stage) { 
     stage.setTitle("Face Clicker"); 
     stage.setScene(new Scene(createContent())); 
     stage.sizeToScene(); 
     stage.show(); 
     Services.get(VideoService.class).ifPresent(service -> { 
      service.getPlaylist().add("china.wav"); 
      service.play(); 
     }); 

    } 

    class myMouseEvent implements EventHandler<MouseEvent> { 

     @Override 
     public void handle(MouseEvent e) { 

      if (e.getButton() == MouseButton.PRIMARY) { 
       score.addScore(1, 1); 
       generation.setText("Score: " + score.getScore()); 
       // if(Math.random()*5 == 1){ 
       // face.setRage(); 
       // } 
       // if(face.getRage()){ 
       setRandomDx(); 
       setRandomDy(); 
       // } 

       animate.start(); 

      } 

     } 

    } 

    private class Animate extends AnimationTimer { 
     private long n = 100_000_000; 
     private long last = 0; 

     @Override 
     public void handle(long now) { 
      if (now - last >= n) { 
       // what happens when animation happens 
       if (face.getXValue() + img.getBoundsInLocal().getWidth()/2 > borderPane.getWidth()) { 
        dx = -dx; 
       } 
       if (face.getXValue() - img.getBoundsInLocal().getWidth()/2 <= (-1) * borderPane.getWidth()/2) { 
        dx = -dx; 
       } 
       if (img.getBoundsInLocal().getHeight()/2 + face.getYValue() >= borderPane.getHeight()/2) { 
        dy = -dy; 
       } 
       if (face.getYValue() - img.getBoundsInLocal().getHeight()/2 <= (-1) * borderPane.getHeight()/2) { 
        dy = -dy; 
       } 
       speedImg(img, dx, dy); 

      } 
     } 
    } 

} 

ありがとうございまし部分コードキャッシュコレクション、コード= 26キロバイト、データ= 30キロバイト 09から22を行いますコードキャッシュの収集後、コード= 25KB、データ= 30KB 09-22 16:28:44.475 29162 29167 I art:128KBへのコードキャッシュ容量の増加 09-22 16:28: 44.634 29162 29185 W art:Android 4.1より前のjavafx.scene.text.TextFlow.computeChildPrefAreaHeight(javafx.scene.Node、javafx.geometry.Insets)メソッドは、javafx.scene.layoutのpackage-privateメソッドを誤ってオーバーライドしていました。地域 09-22 16:28:44.634 29162 29185 W art:Android 4.1より前のjavafx.scene.text.TextFlow.computeChildPrefAreaWidth(javafx.scene.Node、javafx.geometry.Insets)メソッドは、package-privateを間違ってオーバーライドしていましたメソッドjavafx.scene.layout.Region 09-22 16:28:44.634 29162 29185 I System.out:0.0,0.0 09-22 16:28:44.635 1241 3128 D CustomFrequencyManagerService:releaseDVFSLockLocked:取得ロックタイプfrmリスト: DVFS_MIN_LIMIT頻度:2361600 uid:1000 pid:1241タグ:APP_LAUNCH @ CPU_MIN @ 6 09-22 16:28:44.636 29162 29185 W art:クラスjavafx.scene.image.Imageがロック検証に失敗し、より遅く実行されます。 09-22 16:28:44.644 29162 29185 W art:クラスcom.sun.javafx.iio.ImageStorageがロックの検証に失敗し、処理が遅くなります。 09-22 16:28:44.734 29162 29185 W art:Class javafx.scene.Scene $ ScenePeerPaintListenerはロックの検証に失敗し、より遅く実行されます。 09-22 16:28:44.737 29162 29185 W art:Android 4.1以前は、メソッドcom.sun.javafx.scene.transform.TransformUtils $ ImmutableTransform.ensureCanTransform2DPoint()がjavafx.sceneのpackage-privateメソッドを間違ってオーバーライドしていました.transform.Transform 09-22 16:28:44.748 29162 29185 W art:クラスcom.sun.javafx.text.Gly​​phLayoutはロック検証に失敗し、より遅く実行されます。 9月22日16:28:44.778 29162 29185 IはDefaultVideoService:プレイリストが変更された:{[china.wav] 0で添加} 9月22日16:28:44.778 29162 29185 I DefaultVideoService:ファイル:china.wav既に 09を存在します-22 16:28:44.779 29162 29185 I AndroidVideoService:china.wav用の新しいMediaPlayerの作成 09-22 16:28:44.785 29162 29185 I MediaPlayer:コンテキスト対応情報を有効にする必要があります 09-22 16:28:44.785 29162 29185 V-MediaPlayerのJNI:native_setup 9月22日16:28:44.785 29162 29185 E-MediaPlayerのJNI:JNIMediaPlayerFactory:bIsQCMediaPlayerPresent 0 9月22日16:28:44.785 29162 29185 E-MediaPlayerのJNI:JNIMediaPlayerFactory:bIsQCMediaPlayerPresent 0 9月22日16:28:44.785 29162 29185 V MediaPlayer:コンストラクタ 09-22 16:28:44.788 29162 29185 V Med iaPlayer:setListener 09-22 16:28:44.801 757 757 V MediaPlayerService:pidから新しいメディアレトリーバーを作成29162 09-22 16:28:44.805 29162 29185 W System.err:アプリケーション開始メソッドの例外 09-22 16 :28:44.833 1241 1699 I qti_sensors_hal:processReportInd:Accel - X:0.893 Y:1.211 Z:9.90

答えて

0

JavaFX on mobileはメディアをサポートしていません。現在サポートされている機能については、answerを参照してください。

しかし、それはあなたのデバイスからネイティブプレーヤーを使用することはできませんことを意味しません。

最近、Charm Down(プラットフォームに依存しない統一されたAPIを使用してデバイスとそのハードウェア機能にアクセスするオープンソースライブラリ)がビデオサービスを追加しました。

hereの使い方については、短い投稿があります。

基本的には、videoビルドでプラグイン含める必要があります:リソースフォルダ/src/main/resoures

// build.gradle 
jfxmobile { 
    downConfig { 
     version = '3.6.0' 
     plugins 'display', 'lifecycle', 'statusbar', 'storage', 'video' 
    } 
} 

場所のオーディオ/ビデオファイルを、または有効なURLを提供し、その後、あなたはできるようになります

Services.get(VideoService.class).ifPresent(service -> { 
    service.getPlayList().add("myAudio.wav"); 
    service.play(); 
}); 

オーディオは目に見えるコントロール(MediaView)を追加せず、バックグラウンドで再生されます。いくつかのボタンを追加して、オーディオの再生/一時停止/停止を行うことができます。

+0

ありがとうございます。私はbuild.gradleにプラグインを追加しましたが、コードがVideoService.classを見つけることができないためサービスを利用できないようです。他に何かする必要がありますか?サービスを使用しますか? –

+0

ビルドファイルを変更したら、プロジェクトをリロードして、新しい依存関係をダウンロードする必要があります。プロジェクトを開く場合は、charm-down-plugin- * jarsがあるかどうかを確認してください。 –

+0

私はまだコーディングの初心者ですが、私は手動でビデオプラグインを依存関係に追加することができました。コードはコンパイルされますが、コードはサービスを実行したくないようです。このメッセージが表示されます。SEVERE:javafx.platformが定義されていません。デスクトップはデフォルトで使用されます。コードの残りの部分は実行されますが、サービスが呼び出されると、プログラムが単にフリーズします。 –

関連する問題