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

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

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

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

Q&A

2回答

2086閲覧

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

reotantan

総合スコア295

Android

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

0グッド

0クリップ

投稿2016/12/08 05:38

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); // } } ```

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

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

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

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

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

guest

回答2

0

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

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

java

1Handler handler= new Handler(); 2 3handler.post(new Runnable() { 4 @Override 5 public void run() { 6 textView.setText("Hello!"); 7 } 8});

投稿2016/12/20 22:05

aja

総合スコア3733

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

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

0

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

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

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

投稿2016/12/08 05:50

majiponi

総合スコア1720

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

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

reotantan

2016/12/08 06:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問