【教えて下さい】SurfaceViewを含む画面をPagerVIewでページ切り替えした際に、新しい画面の一部にSurfaceViewが残る件について

925 views
Skip to first unread message

onigu...@gmail.com

unread,
Sep 16, 2013, 10:18:11 PM9/16/13
to android-g...@googlegroups.com
いつもお世話になっております。

今回も皆さんの助言をいただければ幸いです。
よろしくお願い致します。

●件名のとおり、SurfaceViewを含む画面をPagerVIewでページ切り替えした際に、新しい画面の一部にSurfaceViewが残ってしまいます。
ページ切り替えした際に、SurfaceViewが残らないようにしたいのですが、方法(原因)が分からず困っております。

●画面の構成は下図の通りです。

-------------Page_1--------------          -------------Page_2--------------
|  |-----SurfaceView-------|   |          |  |---------TextView-------|   |
|  |                              |   |          |  |                              |   |
|  |                              |   |          |  |                              |   |
|  |                              |   |          |  |                              |   |
|  |------------------------------|   |          |  |------------------------------|   |
|                                     |  ←→ |                                     |
|  |--------TextView---------|   |          |  |--------TextView---------|   |
|  |                              |   |          |  |                              |   |
|  |                              |   |          |  |                              |   |
|  |                              |   |          |  |                              |   |
|  |------------------------------|   |          |  |------------------------------|   |
--------------------------------------          --------------------------------------

・Page_1とPage_2をPagerViewで切り替えできるようにしてある。
・Page_1には問題のSurfaceViewがある。

ここで
●Page_1からPage_2へページ切り替えした際に、Page_1のSurfaceViewがPage_2に表示されてしまいます。

●ページ切り替えした際に、SurfaceViewが残らないようにする方法(原因)をご教授いただければ幸いです。

よろしくお願い致します。

MORIHIRO

unread,
Sep 17, 2013, 9:46:10 AM9/17/13
to android-g...@googlegroups.com
テストアプリを作ってみましたが、
手持ちのGalaxyNexus(Android4.3)で動作確認してみたら、
SurfaceHolder.unlockCanvasAndPost()でIllegalArgumentExceptionが発生。。。
(GalaxyNote2ではご質問の現象もExceptionも再現せず)

どうも以下の情報をみると現状、回避策がないバグがあるようです。

Issue 58385 - android - android 4.3 - IllegalArgumentException at SurfaceHolder.unlockCanvasAndPost(canvas) - Android Open Source Project - Issue Tracker - Google Project Hosting
http://code.google.com/p/android/issues/detail?id=58385

元々の質問の回答ではありませんが、
作成中のアプリのターゲットにAndroid4.3が含まれているようでしたら
ちょっと気をつけておいた方がいいかもしれません。

以上、ご参考まで。


2013年9月17日火曜日 11時18分11秒 UTC+9 onigu...@gmail.com:

onigu...@gmail.com

unread,
Sep 17, 2013, 8:40:01 PM9/17/13
to android-g...@googlegroups.com
MORIHIRO様

ご返信ありがとうございます。

投稿いただいたような問題があるのは存じておりませんでした。
勉強になりました!
ありがとうございます。

申し遅れましたが、私の環境はAndroid2.3.3です。

もともとは、初回投稿で示したSurfaceViewの所にVideoViewで動画を再生するという事を行っておりました。
調査した結果、SurfaceViewがある場合に、画面の一部に表示したくない画像が表示されてしまう事がわかったという経緯です。

今回投稿したSurfaceViewは、中身は何もないもの(定義と画面表示のみ)でも発生しております。

SurfaceViewの基本的な使い方が間違っているのかと勉強し直しておりますが、
未だ解決できておりません。

些細な事でも、もし情報があるようでしたら、ご提供お願いいたします。

MORIHIRO

unread,
Sep 17, 2013, 11:36:33 PM9/17/13
to android-g...@googlegroups.com
Emulatorでしか確認してませんけど、View生成時とかで
  SurfaceView.setZOrderOnTop(true);
を実行しておくと状況は改善するようです。

原因とか副作用とかは分かっていないので、
onigu...さんの環境で有効かどうかは不明ですが。。。


2013年9月18日水曜日 9時40分01秒 UTC+9 onigu...@gmail.com:

onigu...@gmail.com

unread,
Sep 18, 2013, 2:06:51 AM9/18/13
to android-g...@googlegroups.com
MORIHIRO様

再度の返答ありがとうございます。

仰られた通り、
SurfaceView.setZOrderOnTop(true);
を実行してみました。

その結果、私の環境では状態は改善されました。
感謝致します!



ただ、一部問題があります。

問題点
遷移先のページにButtonやEditViewの文字があるとき、その文字部分にのみSurfaceView(VideoView)が表示されてしまうという点です。

この問題については、引き続き、情報提供を受け付けております。
ご存知の方がいらっしゃいましたら、よろしくお願い致します。

MORIHIRO

unread,
Sep 18, 2013, 10:01:04 AM9/18/13
to android-g...@googlegroups.com
手持ちの環境(NexusOne, Emulator)では再現しませんでしたので、
私の方ではお手上げです。。。

2013年9月18日水曜日 15時06分51秒 UTC+9 onigu...@gmail.com:

onigu...@gmail.com

unread,
Sep 18, 2013, 8:07:29 PM9/18/13
to android-g...@googlegroups.com
自己調査の経過報告


問題点
遷移先のページにButtonやEditViewの文字があるとき、その文字部分にのみSurfaceView(VideoView)が表示されてしまうという点です。

文字の色が黒の場合のみ上記問題が発生しました。

eaglesakura

unread,
Sep 18, 2013, 8:24:37 PM9/18/13
to android-g...@googlegroups.com
@eaglesakuraです。

SurfaceViewは内部的な仕組み上、PagerのようにView移動を伴うような動作は行いにくくなっています。
(SurfaceViewの位置へ新しいWindowを無理やり作ってると考えてください)
また、ICS以上とそれ未満の端末でSurfaceViewと他のViewを重ねあわせた際の色ブレンド挙動が異なる場合があります。

Android 4.0以上であればTextureViewを利用することで回避できますが、それ未満対応の場合はページ切り替え時にSurfaceViewを一度廃棄して、再度利用開始時に生成する等が最大公約数的な解決かと思いますが如何でしょうか?


2013年9月19日木曜日 9時07分29秒 UTC+9 onigu...@gmail.com:

onigu...@gmail.com

unread,
Sep 18, 2013, 11:08:29 PM9/18/13
to android-g...@googlegroups.com
eaglesakura様

投稿ありがとうございます。

>ページ切り替え時にSurfaceViewを一度廃棄して、再度利用開始時に生成する等が最大公約数的な解決かと思いますが如何でしょうか?
SurfaceView.setVisibility(View.GONE);
上記を実行することで、問題は解消されました。
感謝致します。

Androidのバージョンによって、内部の動作も変わる所が多いのですね。
勉強になります。
Reply all
Reply to author
Forward
0 new messages