スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SurfaceViewで縦横がおかしい

青い空では、SurfaceViewを使っているのですが、
端末によっては横にした際に上手く表示できないという障害がありました。
(横にしているのに、縦横が逆に返ってくる。端末のデフォルトと逆にしたときに発生するようです。)


ただ、IS01でも、Archos7HTでも、Webstationでも、エミュレータでも平気なので、どうせ中華端末だったり、
CFWだったりするんだろうな・・・と思って無視していましたが、001HTでも発生するという事実に驚愕したので、
改めて調査してみました。


で、調べてみたところ、
surfaceCreated⇒surfaceChanged⇒surfaceChanged
と実行され、2度目のsurfaceChangedに初めて縦横正しい値が入ってくるというものでした。
※正しく値が返る端末ではそれぞれ1度ずつしか実行されない。

surfaceChangeで、ファイルの読み込み処理を開始するのですが、
AsyncTaskがある程度進んだ段階で描画を開始してしまいます。
この時のページ計算などで、1度目のsurfaceChangedでの縦横を利用していたために、おかしな描画になってしまっていました。
2度目のsurfaceChangedにて、すでにAsyncTaskが走っていたら、キャンセルをして、再度・・・
という処理をいれたのですが、cancelして、すぐonCanceledが呼ばれるわけではないので、
別途フラグなどによりタスクの実行を同期させるなど必要があったり結構シビアな難しいケースも想定されたので、別の方式を検討することにしました。
※postExxecuteで最後一括して処理するタイプなら話は結構簡単だったんですけどね・・・

また、このアプリでは、
直前の画面の画面向きを引き継ぎつつ、ローテーションを禁止したいため、以下の処理をしていました。
これも問題の原因かもしれません。というわけでこちらからせめていくことにしました。
AActivityからorientationをIntentで渡す。
->
BActivity(nosensor)
にて、前の画面から受け取ったorientationによって、
setRequestedOrientationを設定。
そこからViewをsetContentする。


二度目のsurfaceChangedが呼ばれたら、AsyncTaskを中断してやり直すという処理をしようとしましたが、
色々問題があったので、結局以下の対応としました。

1)BActivity(protrait)とする
2)CActivity extends BActivity(landscape)を用意(何もオーバーライドしない)
3)AActivityで、orientationを設定する変わりに、BまたはCを呼びわける。


これで無事surfaceChangedが1度しか呼ばれないように出来ました。
関連記事

コメントの投稿

非公開コメント

スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。