方位角を基に画像を表示させたい

スポンサーリンク
スポンサーリンク
スポンサーリンク

SurfaceViewとか

画像とかを連続して描画するのには、SurfaceViewというものを使うといいらしい。他にもTextureViewとかCustomViewとかあるらしいんだけどよく分からん。なんかAndroidのバージョンごとに推奨された変遷があるらしい。みんな使ってそうで、ネット上でも解説記事がある程度見つかるSurfaceViewを使ってみたい。

無理でした

途中まで頑張ったんだけど、やり方がよくわからなくなってしまった。SurfaceView.javaを新しく作ってそこに処理を書いて、MainActivity.javaでsetContentViewする感じにしたんだけど。センサーの値の取得をMainに書いてて、その値をSurfaceの方に渡すやり方がわからない。MainActivityの中でSurfaceViewを扱うやり方も分からない。ので別のやり方を探す。

参考

Android 7.0 では TextureView よりも SurfaceView が推奨されるらしい。 - なるようになるかも
まじかよ!ってなったので。 たぶん、大半の人にとってはどうでもよいです。 公式リファレンスの Android N for Developers の英語版には以下の記述があります。(いまのところ日本語には訳されていないです) Android 7.0 brings synchronous movement to the S...
https://blog.keiji.io/2015/12/mincomi-adventcalendar-20.html
SurfaceViewで高速描画する(1) | TechBooster
SurfaceViewは高速に描画を行うための仕組みです。 通常のViewでは処理が間に合わない、ゲームやマルチメディアなど高速処理に向いています。別スレッドで描画するため、資源の排他処理などマルチスレッドを意識する必要があります。
SurfaceViewで高速描画する(2) 処理落ちを考慮したタイマ処理 | TechBooster
SurfaceViewのサンプルとして紹介するのはインベーダーゲーム・マリオブラザーズのようにユーザーのアクションが無くても時間が経過していくアクションゲームロジックです。 Threadを使った連続描画(無限ループ)や処理落ちを考慮した移動量調整について解説します

ImageViewを使う

適当に作った画像を用意。

<ImageView
    android:id="@+id/imageView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginStart="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/textView"
    app:srcCompat="@drawable/needle" />

ImageViewを設置。

imageView = findViewById(R.id.imageView);
bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.needle);
imagewidth = bitmap1.getWidth();
imageheight = bitmap1.getHeight();

onCreateでimageViewの取得とdrawableから画像を取得。

azimuth = (float) Math.toDegrees(attitude[0]);
matrix.setRotate(-azimuth, imagewidth / 2, imageheight / 2);
Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, 0, 0, imagewidth, imageheight, matrix, true);

imageView.setImageBitmap(bitmap2);

onSensorChangedで方位角からMatrixを使ってsetRotateで新たにBitmap作る。でImageViewにセット。これ計算合ってるかな。

回った!!なんかカクカクwあと見て分かる通り、回転するごとに画像が拡大縮小してしまう。すっごい方角がずれる。いっぱい動かしたりすると、アプリが固まる。うーん、なんか思ったような感じになってくれないなぁ。めんどくさくなってきたなぁ。

参考

[Android] Matrixで画像を回転、フリップ、縮小させる
画像を拡大、回転させたりするときは、Matrixを使うことができます。ただし基本的に画像処理はパフォーマンス、メモリを使いますので注意しましょう。

コメント

タイトルとURLをコピーしました