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

android OS & iPadOS の記録。

【kotlin】 画像ビュワー画像送りを再考

2024-03-09 01:23:46 | Android studio 日記

タブレット横長の状態でJPG、PNGを表示。
ディレクトリ単位でリスト化してインデックスNoで表示画像をコントロール。


表示モードは1枚、2枚単位で。
1枚表示モードで画像が縦長1枚は270度回転。
2枚表示モードで縦長2枚は左右並びで2枚表示。
画像が横長なら1枚表示に切り替え。

 

ファイルフルパスをリストアップして順番に取り出し表示させるのが基本。
1枚か2枚の固定であれば難しくないのだが。

条件分岐させるので面倒である。

Javaの時は複雑になってしまった。
Kotlinでは簡素化を心掛けデータ構成。

現在表示されているファイルリストの
Index Noを TargetNo
ファイル名を TargetFileName
そのタイプを TargetShape  // 縦長、横長
サブファイル TargatSubFileName
サブタイプを TargetSubShape

次の表示の為に準備する情報を
NextTargetNo
NextTargetFileName
NextTargetShape
NextTargatSubFileName
NextTargetSubShape

画像の形状を調べてプロパティに代入。
形状を絡めた2枚表示の進む、戻るの分岐が面倒だ。


TargetNo
TargetFileName
TargetShape
TargatSubFileName
TargetSubShape

TargetNoが基準となる。
1枚表示なら、
NextTargetNo = TargetNo+1 or TargetNo-1

で、その結果を

NextTargetNo
NextTargetFileName
NextTargetShape
NextTargatSubFileName
NextTargetSubShape

に設定する。簡単。

 

2枚表示の場合は、

TargetNo
TargetFileName
TargetShape
TargatSubFileName
TargetSubShape

TargetShapeか、TargetSubShapeが両方とも縦長の場合は
進む時、TargetNo+2で、NextTargetを設定する。
これも簡単。


戻る時は、TargetNo-2 では間違い。
形状が重要なのでインデックス1つずつ調べる。

NextTargetNo = TargetNo - 1
NextTargetFileName
NextTargetShape

調査後にNextTargetShapeが縦長なら

val no = NextTargetNo - 1
val path = ファイルリスト[no]
val shape = pathの画像が縦?横?

shapeが縦長なら

NextTargatSubFileName = NextTargetFileName
NextTargetSubShape = NextTargetShape
NextTargetFileName = path
NextTargetShape = path
NextTargetNo = no

shapeが横長なら

NextTargatSubFileName = ""
NextTargetSubShape = -1

で終わり。

 

次は、
TargetNo
TargetFileName
TargetShape
TargatSubFileName
TargetSubShape

TargetShapeか、TargetSubShapeのどちらかが横長の場合は
TargetFileNameの1枚だけを表示している。

TargatSubFileName = ""
TargetSubShape = -1
にしている。


この状況で次を準備するとき

進む時、TargetNo+1で、NextTargetを設定する。

NextTargetNo = TargetNo+1
NextTargetFileName
NextTargetShape

NextTargatSubFileName = ファイルリスト[NextTargetNo+1]
NextTargetSubShape

NextTargetSubShape、NextTargetShape どちらか横なら

NextTargatSubFileName = ""
NextTargetSubShape = -1


前に戻す時、

NextTargetNo = TargetNo - 1
NextTargetFileName = ファイルリスト[NextTargetNo]
NextTargetShape

NextTargetShapeが縦長なら

val no = NextTargetNo - 1
val path = ファイルリスト[no]
val shape = pathの画像が縦?横?

shapeが縦長なら

NextTargatSubFileName = NextTargetFileName
NextTargetSubShape = NextTargetShape
NextTargetFileName = path
NextTargetShape = path
NextTargetNo = no

shapeが横長なら

NextTargatSubFileName = ""
NextTargetSubShape = 横

 

NextTargat情報を元に画像をBitMapに構築する。
そして、情報を更新。

TargetNo = NextTargetNo
TargetFileName = NextTargetFileName
TargetShape = NextTargetShape
TargatSubFileName = NextTargatSubFileName
TargetSubShape = NextTargetSubShape

Targetは、現在スクリーンに表示されている情報。
NextTargatは、進む戻るで準備された次に表示させる情報。


Javaの時は配列のNoに意味付けして配列を渡してたけど、分かりづらかった。
クラスのプロパティにして準備と本配置で区別したので、日にちが経っても思い出しやすい。

 

テストでディレクトリ内の縦横混在画像を想定通りに表示させられたので、
サムネイル表示フラグメントをKotlinに書き直す。

 


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

【kotlin】 設計の再確認

2024-03-03 23:19:02 | Android studio 日記

私の持っている古い(API17)androidタブレットをターゲットに開発する。(表示サイズに難あり)
メモリが少ないのでピンチによる拡大縮小は今後の課題で後回し。
簡単に拡張できるように構成を考える。

横長固定。いづれはデバイス回転でモード切り替えができるような構成を考える。
他、メモリリーク対策など。

Kotlinが意外と曲者で熟知している知人が居れば移行はできそう。
独学となると、必要としている情報を見つけ出すのに時間を取られる。
粘り強い人は良いけど、そうでなければJavaが無くなるまで続けるのが…。

 

余白埋めで、基本的な部分の viewModel を Fragment で使うまとめ。

Activityで宣言したViewModelをFragmentで使う。
Kotlinの説明がWeb上に少ないが、使途別は多い。どれを使えばいいか判断しにくい。
それでも自動変換となんやらかんやらで動くようになったので記録する。

ちょっと、反則?みたいだけど、まぁいいか。
本来はプロパティでリアルタイム更新?に使う感じなのかな。

【MainActivity】

class MainActivity : AppCompatActivity() {
    private val viewModel : MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel.loadData(this)
    }

    override fun onDestroy() {
        viewModel.storeData(this)
        super.onDestroy()
    }
}


【MainFragment】

class MainFragment : Fragment() {

    private val viewModel: MainViewModel by activityViewModels()
    private var fileListManager: MyFileListManager? = null
    private var fileList: MyFileList? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        fileListManager = viewModel!!.fileListManager
        fileList = viewModel!!.fileList
    }

    override fun onDestroyView() {
        super.onDestroyView()
        fileListManager = null // フラグメントが終了したら参照を切る
        fileList = null
    }
    override fun onDestroy() {
        super.onDestroy()
    }
}

【ViewModel】

class MainViewModel: ViewModel() {

    private val _fileListManager: MyFileListManager
    private val _fileList: MyFileList

    init {
        _fileList = MyFileList()
        _fileListManager = MyFileListManager()
        _fileListManager.setFileList(_fileList) // インスタンス作成時に合わせってセットしたかった。
    }

    val fileListManager: MyFileListManager
        get() = _fileListManager
    val fileList: MyFileList
        get() = _fileList


    fun loadData(context: Context) {
        try {
            val pref = PreferenceManager.getDefaultSharedPreferences(context)
            //省略 Preferencesから読み出し
        } catch (e: Exception) {
            //省略
        }
    }

    fun storeData(context: Context) {
        try {
            val editor = PreferenceManager.getDefaultSharedPreferences(context).edit()
            //省略 ViewModelの一部をPreferencesに保存
        } catch (e: Exception) {
            //省略
        }
    }

    fun finish() {
        _fileList.finish()
        _fileListManager.finish()
    }

    override fun onCleared() {
        finish()
        super.onCleared()
    }
}

 


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする