質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

2683閲覧

MPAndroidChartを用いたスペクトルアナライザが画面をタッチしないと表示されない問題について

tcb78

総合スコア5

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/05/15 09:23

編集2019/05/17 08:59

問題

MPAndroidChartを用いてスペクトルアナライザを作成しているのですが、録音開始後も表示されません。
しかし、何も表示されていないグラフをタッチするとグラフが表示されます。
これを画面タッチせずに表示させたいのですが、どのようにすれば良いでしょうか。

ソースコード

MPAndroidChartに関係する部分のみ抜き出しています。録音等は正常に作動していることを確認済みのため割愛します。

java

1//初期化 2initChart(); 3 4myThread = new Thread(new Runnable() { 5 @Override 6 public void run() { 7 byte[] recordData = new byte[RECORD_BUFFER_SIZE]; 8 while (isRecording) { 9 setData(decibelFrequencySpectrum); 10 } 11 } 12}); 13myThread.start();

java

1public void initChart() { 2 3 lineChart.setTouchEnabled(true); 4 lineChart.setDragEnabled(false); 5 6 // Grid背景色 7 lineChart.setDrawGridBackground(true); 8 9 // no description text 10 lineChart.getDescription().setEnabled(true); 11 12 lineChart.setBackgroundColor(Color.LTGRAY); 13 14 LineData data = new LineData(); 15 data.setValueTextColor(Color.BLACK); 16 17 // add empty data 18 lineChart.setData(data); 19 20 // Grid縦軸を破線 21 XAxis xAxis = lineChart.getXAxis(); 22 xAxis.setAxisMaximum(2048); 23 xAxis.setAxisMinimum(0); 24 xAxis.enableGridDashedLine(10f, 10f, 0f); 25 xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); 26 27 YAxis leftAxis = lineChart.getAxisLeft(); 28 // Y軸最大最小設定 29 leftAxis.setAxisMaximum(0f); 30 leftAxis.setAxisMinimum(-150f); 31 // Grid横軸を破線 32 leftAxis.enableGridDashedLine(10f, 10f, 0f); 33 leftAxis.setDrawZeroLine(true); 34 // 右側の目盛り 35 lineChart.getAxisRight().setEnabled(false); 36} 37 38public void setData(double[] data) { 39 40 ArrayList<Entry> values = new ArrayList<>(); 41 42 for (int i = 0; i < data.length; i++) { 43 values.add(new Entry(i, (int)data[i], null, null)); 44 } 45 46 LineDataSet set1; 47 48 if (lineChart.getData() != null && 49 lineChart.getData().getDataSetCount() > 0) { 50 51 set1 = (LineDataSet) lineChart.getData().getDataSetByIndex(0); 52 set1.setValues(values); 53 lineChart.getData().notifyDataChanged(); 54 lineChart.notifyDataSetChanged(); 55 } else { 56 // create a dataset and give it a type 57 set1 = new LineDataSet(values, "Spectral"); 58 set1.setDrawIcons(false); 59 set1.setColor(Color.rgb(0, 0, 240)); 60 set1. setDrawCircles(false); 61 set1.setLineWidth(0.5f); 62 set1.setValueTextSize(0f); 63 set1.setDrawFilled(false); 64 set1.setFormLineWidth(1f); 65 set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f)); 66 set1.setFormSize(15.f); 67 set1.setDrawValues(true); 68 69 ArrayList<ILineDataSet> dataSets = new ArrayList<>(); 70 dataSets.add(set1); // add the datasets 71 72 // create a data object with the datasets 73 LineData lineData = new LineData(dataSets); 74 75 // set data 76 lineChart.setData(lineData); 77 } 78}

アプリ画面

アプリ起動時の画面です。アプリ名の下にあるSwitchをタッチすると録音と描画が開始されるはずです。
イメージ説明
Switchをタッチした後の画面です。録音は開始されましたがグラフにはなにも描画されません。
イメージ説明
グラフをタッチ(スライド)するとその瞬間の録音データが描画されます。指を離すとまた描画が更新されなくなります。
これをタッチなしで描画・更新されるようにしたいです。
イメージ説明

補足

MPAndroidChartはv3.0.3です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

プログラムの全容が分からないので何とも言えない部分がありますが、viewに対する変更(invalidate)をメインスレッド以外のスレッド(録音スレッド?)で呼び出しているのが原因のようです。(CalledFromWrongThreadException)
CalledFromWrongThreadExceptionで調べると別スレッドからメインスレッドのviewを変更する方法が色々でてきたので、それをまず参考にしてみては如何でしょうか

投稿2019/07/29 05:49

tennpalight

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tcb78

2019/07/29 05:59

メインスレッド以外のスレッドでUIを変更するときはhandlerというものが必要のようですね。 恥ずかしながら初めて知りました。 ご教示頂きありがとうございました。
guest

0

lineChart.invalidate()
をsetDataで呼び出してみては如何でしょうか

投稿2019/07/24 09:27

tennpalight

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tcb78

2019/07/29 05:34

回答ありがとうございます。 公式ドキュメント等を参考にしながら、setDataの lineChart.notifyDataSetChanged() のすぐ下に lineChart.invalidate() を追加したのですが、エラーになってしまいました。 E/AndroidRuntime: FATAL EXCEPTION: Thread-4 Process: com.example.xxxx.spectrumanalyzer, PID: 13995 android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6856) at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1075) at android.view.ViewGroup.invalidateChild(ViewGroup.java:5242) at android.view.View.invalidateInternal(View.java:13578) at android.view.View.invalidate(View.java:13542) at android.view.View.invalidate(View.java:13526) at com.example.xxxx.spectrumanalyzer.MainActivity.setData(MainActivity.java:263) at com.example.xxxx.spectrumanalyzer.MainActivity$1.run(MainActivity.java:103) at java.lang.Thread.run(Thread.java:761) また、setData内の lineChart.setData(lineData) の下に追加するなどしてみましたが同じようなエラーが出ました。 どこに入れるのが適切でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問