画像の縦横斜めのスクロールは、タップイベントの取得がシンプル、その他も都合良さそうなので Activity で実現する事に。設定やファイル表示などレイアウトしやすい Fragment がいいのかな。それから、デバイスが回転したときの処理を組み込んでいたが、リアルサイズモードでは回転アクションに問題なし。フィットモードでデバイスがランドスケープ状態になった時に画像がポートレートだと小さくなってしまうので、90度回転してデバイス合わせる。という仕様にしたら、アクションが2重に行われる事になった。システムが回転する。その後にプログラムで回転する。ライフサイクル等を考えて非表示を設定して画像が回転した後に表示に戻すを試したがシステム回転が白紙を回転という状態に・・・。システム回転自体を非表示にできない。なのでランドスケープ固定でアプリは実行させる。
画像表示の部分を主幹でまとめて記録する。装飾は省略。
public class MainActivity extends AppCompatActivity {
private int targetIndexNo; // 停止、復帰時に復元して欲しい変数
private boolean realSizeFlag, pageModeFlag, openPageFlag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // ランドスケープ固定
pageModeFlag = true; // Activity の再描画でもデータを保持して欲しい変数
openPageFlag = true;
realSizeFlag = true;
targetIndexNo = 0;
}
@Override
protected void onResume() {
super.onResume();
// フルスクリーン表示
int uiOptions = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
} else {
uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
}
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(uiOptions);
}
@Override // デバイス回転の時、データが失われる場合がある。復元の用意をしておく。
protected void onSaveInstanceState( Bundle outState ) {
super.onSaveInstanceState(outState);
outState.putInt( "TARGET_INDEX_NO", targetIndexNo );
outState.putBoolean( "REAL_SIZE_FLAG", realSizeFlag );
outState.putBoolean( "PAGE_MODE_FLAG", pageModeFlag );
outState.putBoolean( "OPEN_PAGE_FLAG", openPageFlag );
}
@Override // データ復元
protected void onRestoreInstanceState( Bundle savedInstanceState ) {
super.onRestoreInstanceState(savedInstanceState);
targetIndexNo = savedInstanceState.getInt("TARGET_INDEX_NO" );
realSizeFlag = savedInstanceState.getBoolean("REAL_SIZE_FLAG" );
pageModeFlag = savedInstanceState.getBoolean("PAGE_MODE_FLAG" );
openPageFlag = savedInstanceState.getBoolean("OPEN_PAGE_FLAG" );
}
【AndroidManifest.xml】
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.packagename.testviewer3">
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.TestViewer3">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/Theme.TestViewer3.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
【themes.xml】
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="Theme.TestViewer3" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryDark">@color/purple_700</item>
<item name="colorAccent">@color/teal_200</item>
</style>
<style name="Theme.TestViewer3.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="Theme.TestViewer3.Fullscreen" parent="Theme.TestViewer3">
<item name="android:actionBarStyle">@style/Widget.Theme.TestViewer3.ActionBar.Fullscreen</item>
<item name="windowNoTitle">true</item> <!--追加-->
<item name="windowActionBar">false</item> <!--追加-->
<item name="android:windowFullscreen">true</item> <!--追加-->
<item name="android:windowContentOverlay">@null</item><!--追加-->
<item name="android:windowActionBarOverlay">false</item>
<item name="android:windowBackground">@null</item>
</style>
<style name="ThemeOverlay.TestViewer3.FullscreenContainer" parent="">
<item name="fullscreenBackgroundColor">@color/white</item>
<item name="fullscreenTextColor">@color/light_blue_A200</item>
</style>
<style name="Theme.TestViewer3.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="Theme.TestViewer3.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>
【styles.xml】
<resources>
<style name="Widget.Theme.TestViewer3.ActionBar.Fullscreen" parent="Widget.AppCompat.ActionBar">
<item name="android:background">@color/black_overlay</item>
</style>
<style name="Theme.testviewer3.NoActionBar.Fullscreen" parent="Theme.TestViewer3">
<item name="android:background">@color/black_overlay</item>
</style>
<style name="Widget.Theme.TestViewer3.ButtonBar.Fullscreen" parent="">
<item name="android:background">@color/black_overlay</item>
<item name="android:buttonBarStyle">?android:attr/buttonBarStyle</item>
</style>
</resources>
続く。