タブレット用プログラムの書き止め

android OS & iPadOS の記録。

フルスクリーンとフルスクロール(縦横斜め)

2021-06-09 15:43:05 | Android studio 日記


 C++も構造化の始まりの頃でモジュールを意識させられましたが、android studio ・・凄いことになっていた。テンプレートであれやこれやといじってみたもののエラーの嵐で中々実行まで行かない。ひと月すったもんだしたところ糸口が見えたかなくらいになったので記録を残します。(状況により結果が異なる場合があります。)

 

 1、フルスクリーンの設定。 

「themes.xml」とプログラムで指定するのと二通り。「themes.xml」は、アクティビティの表示モードが変更されない場合。プログラムでは、何かしら表示モードが変更される場合は記述する。とりあえず、両方に記述しておく。

【themes.xml】

   <style>
        <item name="android:actionBarStyle">@style/Widget.Theme.MyTest2.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>

 

  ジェリービーン以前はナビゲーションバーは消せない。

【main.javaのプログラム記述】

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_fullscreen);

        View decorView = getWindow().getDecorView();
        int uiOptions;
        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 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
        } else {
            uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        }
        decorView.setSystemUiVisibility(uiOptions);

    }

 

 キットカット以降はナビゲーションバーも消えるので条件分けする。
 アクションで表示モードを切り替える場合は別途機能を組み込む。

 

 モチベーションが続くので画像関係から始めた。表示ができれば、次ははみ出す大きい画像をスクロール。

 

 

 2、フルスクロール(縦横斜め)。

 ここでは、ただスクロールをさせる。だけ。

【activity_main.xml】

<com.????.mytest2.MyScrollView
    ・・・
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ・・・>

    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/image_view"
            android:scaleType="center"
            android:layout_centerInParent="true"
            android:layout_gravity="center"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

  < /HorizontalScrollView>
</com.????.mytest2.MyScrollView>

 

 (com.????.mytest2)各々のパッケージ。(MyScrollView)新しいクラス。

<MyScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

   

 これでは、ビルドは完了するがエミュレーターがストップしてしまう。

<com.????.mytest2.MyScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

   
</com.????.mytest2.MyScrollView>

 パッケージ名を付加することでエミュレーターで実行される。なぜかは分からない^^;

 次は、MyScrollViewクラスの内容。めもらば様サイトの丸写しです。

Android: 画面サイズよりも大きいViewを縦/横/斜めでスクロールする

【MyScrollView】新規クラス。

package com.????.mytest2;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ScrollView;

public class MyScrollView extends ScrollView {

    public MyScrollView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
    }

    public MyScrollView(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    public MyScrollView(Context context){
        super(context);
    }

    @Override
    public void requestDisallowInterceptTouchEvent(boolean disallowIntercept){

    } // 子要素からTouchEventが抑止されないように、何も処理しない

    @Override
    public boolean onInterceptTouchEvent(MotionEvent mEvent){
        onTouchEvent(mEvent); // TouchEventを子へ伝播させるため、自分でonTouchEventを処理
        return false; // 常に子へ伝播する
    }
}

 

 テスト用の画像を用意するにも一苦労があったので残す。

1,androidstudioでAssetsフォルダを作る。4.1.2バージョンでの作り方は「File > New > Folder >Assets Folder」を選択するとツリーに作ってくれます。ドラッグアンドドロップで画像ファイルを入れるか、コピー&ペーストでAssetsフォルダに用意する。(Assetsフォルダアイコンを右クリックしてペースト)

2、プログラムで画像ファイルを読み込む。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        /* 中略 */


        
        ImageView imageView = findViewById(R.id.image_view);
        try {
            AssetManager assetManager = getResources().getAssets();
            InputStream istream = assetManager.open("1.jpg"); // 画像ファイル名 "1.jpg"
            Bitmap mBitmap = BitmapFactory.decodeStream(istream);
            if (mBitmap != null) {
                imageView.setImageBitmap(mBitmap);
            }
            istream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

ファイル容量が大きいと止まる。パッケージ容量に制限があるため。

 

 

 フォルダアイテムリストの作成をしたいのだが、WindowsのHDDとのやり取りがエミュレーター上でできない。外部ストレージ扱いで登録できないのだろうか?

 

 

フルスクリーン参考

全画面モードの有効化

【 Android アプリ開発 】全画面表示を行う方法 ( 通知バー非表示 )

フルスクロール参考

Android: 画面サイズよりも大きいViewを縦/横/斜めでスクロールする