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

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

ただいまの
回答率

90.51%

  • Android

    7301questions

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

thread.start()中に一定dbを越えたら画像にアニメーションを加えたい

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 806

reotantan

score 252

60デシベルを越えたら、画像にアニメーションを与えたいと思っています。SoundlevelMeterのrun()で
ImageView Monster1=(ImageView)FightActivity.this.findViewById(R.id.Monster1);といったようにイメージビューをとることができません。
どのような形で60デシベルを越えたら、fightactivityのimageviewにアニメーションを加えることができるでしょうか

SoundLevelMeter


       import java.nio.ByteBuffer;

        import android.content.Intent;
        import android.media.AudioFormat;
        import android.media.AudioRecord;
        import android.media.MediaRecorder;
        import android.util.Log;
        import android.view.animation.TranslateAnimation;
        import android.widget.ImageView;
        import android.widget.Toast;

        import static com.example.apponozawa.anasuto.R.id.Monster1;


public class SoundLevelMeter implements Runnable {
    private static final int SAMPLE_RATE = 8000;

    private int bufferSize;
    private AudioRecord audioRecord;
    private boolean isRecording;
    private boolean isPausing;
    private double baseValue;
    static double DB;

    public interface SoundLevelMeterListener {
        void onMeasure(double DB);
    }

    private SoundLevelMeterListener listener;

    public SoundLevelMeter() {

        bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
                AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT);
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,
                SAMPLE_RATE, AudioFormat.CHANNEL_IN_MONO,
                AudioFormat.ENCODING_PCM_16BIT, bufferSize);


        listener = null;
        isRecording = true;
        baseValue = 12.0;
        pause();
    }

    public void setListener(SoundLevelMeterListener l) {
        listener = l;
    }

    @Override
    public void run() {
        android.os.Process
                .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
        resume();


                  short[] buffer = new short[bufferSize];
            while (isRecording) {
                if (!isPausing) {
                    int read = audioRecord.read(buffer, 0, bufferSize);
                    if (read < 0) {
                        throw new IllegalStateException();
                    }

                    int maxValue = 0;
                    for (int i = 0; i < read; i++) {
                        maxValue = Math.max(maxValue, buffer[i]);
                    }

                    DB = 20.0 * Math.log10(maxValue / baseValue);
                    Log.d("SoundLevelMeter", "dB:" + DB);
                    if(DB>=60){
//                        ImageView Monster1=(ImageView)FightActivity.this.findViewById(R.id.Monster1);
//                        TranslateAnimation translate=new TranslateAnimation(0,700,0,700);
//                        translate.setDuration(3000);
//                        Monster1.startAnimation(translate);
                    }
//                        if(DB>=60){
//                          audioRecord.stop();
//                        }

                    if (listener != null) {
                        listener.onMeasure(DB);
                    }
                }

            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        audioRecord.stop();
        audioRecord.release();
    }

    public void stop() {
        isRecording = false;
    }

    public void pause() {
        if (!isPausing)
            audioRecord.stop();
        isPausing = true;
    }

    public void resume() {
        if (isPausing)
            audioRecord.startRecording();
        isPausing = false;
    }

    public void setBaseValue(double value) {
        baseValue = value;
    }
Main activity

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;

public class MainActivity extends AppCompatActivity  {
private Button buttonpushme;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        // ??


        buttonpushme = (Button) findViewById(R.id.startbutton);
        buttonpushme.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
    intent.setClassName("com.example.apponozawa.anasuto","com.example.apponozawa.anasuto.FightActivity");
    startActivity(intent);
}
});
        }

//?



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
//    @Override
//    public void onClick(View v){
//        if(v.getId()==R.id.button);
//        Intent inten=new Intent(thi)
//    }
}
Fight activity


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;




public class FightActivity extends AppCompatActivity {
    private Button Voicebutton;
    public static double volume;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fight_1);
        Voicebutton = (Button) findViewById(R.id.voicebutton);
        //声を出すボタンが押されたら
        Voicebutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                ImageView img=(ImageView)findViewById(R.id.Monster1);
              ImageView baloon=(ImageView)FightActivity.this.findViewById(R.id.ballon1);
                baloon.setVisibility(View.VISIBLE);
                SoundLevelMeter sm=new SoundLevelMeter();
                Thread th1=new Thread(sm);
                th1.start();
//                if (sm.DB>50){
//                    TranslateAnimation translate=new TranslateAnimation(0,700,0,700);
//                    translate.setDuration(3000);
//                    img.startAnimation(translate);
//                }

            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }


//    @Override
//    public boolean onOptionsItemSelected(MenuItem item) {
//        // Handle action bar item clicks here. The action bar will
//        // automatically handle clicks on the Home/Up button, so long
//        // as you specify a parent activity in AndroidManifest.xml.
//        int id = item.getItemId();
//
//        //noinspection SimplifiableIfStatement
//        if (id == R.id.action_settings) {
//            return true;
//        }
//
//        return super.onOptionsItemSelected(item);
//    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

音響関係は専門外ですが…

とりあえずちゃっと調べてみた感じ、Mainスレッド以外ではUIの変更が禁止されているようです。
なので、スレッド間通信を利用して、「Mainスレッドの側で」アニメーションを実現させるのが現実的な対処法だと思います。

参考文献:
http://pentan.info/android/app/multi_thread.html
https://realm.io/jp/news/android-thread-looper-handler/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/08 15:21

    回答ありがとうございました。
    ちょっと質問なのですが、 SoundLevelMeterからImageView Monster1=(ImageView)findViewById(R.id.Monster1);といったようにimageviewをとることができないのですが、
    どうやってlayout/fight_1.xmlにあるimageviewにアクセスするのでしょうか?
    後もう少しで解決できそうです、ありがとうございます

    キャンセル

+1

どうやってlayout/fight_1.xmlにあるimageviewにアクセスする

http://pentan.info/android/app/multi_thread.html 
こちらさんをもう一度よく読んでみましょう
Handlerを使ってpost

Handler handler= new Handler();

handler.post(new Runnable() {
  @Override
  public void run() {
    textView.setText("Hello!");
  }
});

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Android

    7301questions

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