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

android OS & iPadOS の記録。

【kotlin】 画面回転時の画像回転の考察

2024-02-20 03:15:56 | Android studio 日記

画面が回転した時に縦長なら1枚表示で横長なら左右2枚表示にできる目処が立った。
ただ、回転時の画像表示タイミングが良くない。

回転後に切り替わればまぁ良しとしたいが、回転前で画像が切り替わっての横倒しから正常に回転される。
同一画像なら繋がりは自然だけど。

onCreate()で画像をセットすると横倒し表示からの正常位置への回転はシステム決定のよう。
横倒しで表示されるのが次の画像だから凄い違和感がある。
画面回転通知の時だけタイムラグ表示機構を付けないといけないかも。面倒くさ!

override fun onConfigurationChanged(newConfig: Configuration)
ここでimageViewを非表示にセットしたけど消えることはなかった。
恐らく、スクリーンショットのように切り取っているのであろう。

だとすると回転アニメーション利用だろうからアニメーション状態が調べられれば対策取れそうなんだけど…。

あとは画面回転ロックで自前で回転させるとか。面倒くさくさだ!

 

 

ここまで、いろんなタイミングでテスト画像を嵌めたんだけど制御できなかった。
回転の再描画の時だけに回転用画像をonCreate()でimageViewにセットする。
そして、回転完了で本来の画像をセットする。が、一番見栄えが良いと思うんだけど……。

 

途中見つけた画面の向きについての覚え書き。

現在の向きを調べる時は

    fun getOrientation(activity: Activity): Int  {
        val conf: Int
        activity.resources.configuration.orientation.also { conf = it }
        return conf
    }


このメソッドを使用するときは

    val conf: Int = getOrientation(this) //Fragmentで使用は、this -> getActivity() かな

    when (conf) {
        Configuration.ORIENTATION_LANDSCAPE-> //
        Configuration.ORIENTATION_PORTRAIT-> //
        Configuration.ORIENTATION_UNDEFINED -> //
        else-> 
    }

 

 

 


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

【kotlin】 コンストラクタのコード自動変換問題

2024-02-17 04:49:19 | Android studio 日記

クラスを配列にして条件でファイル名を並び替えをさせていたが取り出すと””空文字なってしまった。
JavaのコードをKotlinに自動変換してエミュレータで実行したがエラーは出ていなかった。

しかし、正常にデータを取り出せない。

Kotlinのコンストラクタの説明を読むがよく分からない。
仕方ないのでコードを書き換えて試す。

class MyNumbersInString() {
    var numbersData: Int


    MyNumbersInString(f: File) {} を書き直す。

    constructor(a: type) : this() {}
    constructor(a: type, b: type) : this() {}
    constructor(a: type, b: type, c: type) : this() {}
}

class Sub() {
    var list = ArrayList< MyNumbersInString >()
    var f: File

省略
    list.add( MyNumbersInString(f) )

}

constructor(引数) : 戻り { コード }  こんな感じ?

 

コードの一部分。

class MyNumbersInString() {
 
    private var _absName = String() 
    val absName: String
        get() = _absName
    private var _name1 = String()
    val name1 : String
        get() = _name1

    //省略

   // MyNumbersInString(f: File) { 無変換だったものを

    constructor(f: File) : this() { // これに書き換えると正常になった
        _absName = f.absolutePath
        _name1 = f.name

 

    //省略
    }
}


class Dummy() {

    private var _fileNameList = ArrayList<MyNumbersInString>()

省略
        _fileNameList.add( MyNumbersInString(file) )

省略

        _fileNameList[0].absName // constructor()に書き換えで正常にデータを取り出せた

}

自動変換も万能ではない事が分かった。
異常が出たら検証をしつつ、コード変更を行う。

 


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

【kotlin】 Collections.sort()

2024-02-15 01:24:01 | Android studio 日記

動作試験はしてないけど、忘れないうちに記録する。
Javaは比較のファイル名をメソッドで取得している。
自動変換されたコードもメソッドで取得のまま。
読み出しメソッドが赤字でエラー表示。
Kotlin方式で

    private var _name2: String = ""
    val name2: String
        get() = _name2

読み出し専用プロパティに変更した。
赤字は解消。
他の用意も済んだら動作確認する。

【Java】変換前

        Collections.sort(
                mFileNameList, new Comparator<MyNumbersInString>() {
                    @Override
                    public int compare(MyNumbersInString fNL1, MyNumbersInString fNL2) {
                        return fNL1.getName2().compareTo(fNL2.getName2());
                    }
                }
        );


【Kotlin】自動変換+手直し(name2)

        Collections.sort(
            mFileNameList, object : Comparator<MyNumbersInString> {
                override fun compare(fNL1: MyNumbersInString, fNL2: MyNumbersInString): Int {
                    return fNL1.name2.compareTo(fNL2.name2)
                }
            }
        )

 


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

【kotlin】 デベロッパーの説明では自分のやりたい正解が見つからない

2024-02-13 22:16:41 | Android studio 日記

Javaでは、LiveDataの初期化は任意なのにKotlinのMutableLiveDataはよく分からない。
init{ } がKotlinにはあるので試しに書いてみる。
エラーは出ないし、問題が出なければ、いっか。


class MainViewModel: ViewModel() {
    private val _mainData = MainData()
    val mainData:MainData
        get() = _mainData

    val screenType: MutableLiveData<Int> by lazy { MutableLiveData<Int>() } 
    val rotateLock: MutableLiveData<Int> by lazy { MutableLiveData<Int>() }
    val openBookMode: MutableLiveData<Boolean> by lazy { MutableLiveData<Boolean>() } 

    init {
        screenType.value = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
        rotateLock.value = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
        openBookMode.value = true // true 右開き false 左開き
    }

    ///// リスト ///////////////////////////////////////////

    private var _targetPath = ""
    val targetPath: String
        get() = _targetPath
    fun setTargetPath(path:String){ // Activityのみアクセス
        _targetPath = path
    }

    ///// 画像 ///////////////////////////////////////////

    // 1枚表示か2枚表示かを保持。外部から_pageModeに書き込みできない仕様
    private var _pageMode = 0
    val pageMode: Int // 通常アクセス。読み取り専用
        get() = _pageMode

    // 1枚表示か2枚表示かをセットするメソッド。画面の向きで枚数を決定。使用場所限定。
    fun setPageMode(){
        when(screenType.value){
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT -> {
                _pageMode = 1
            }
            ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE -> {
                _pageMode = 2
            }
            else -> _pageMode = 0
        }
    }

/////////// コルーチン //////////////////////////////
/**
    private val coroutinScope = CoroutineScope(Dispatchers.Main + SupervisorJob())

    fun test(){
        coroutinScope.launch {
            // 非同期処理
        }
    }
*/
    override fun onCleared() {
        super.onCleared()
        _mainData.finish()
        //coroutinScope.cancel()
    }
}

 


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

【kotlin】ViewModelの設計

2024-02-11 03:02:55 | Android studio 日記

数値が更新されたらUIに表すものは、LiveDataで登録。
外部で書き換えできないもの、自由に書き換えできるもの、
危険性を考慮して用意する。


class MainViewModel: ViewModel() {

      // 0-landscape 1-portrait (ActivityInfo)
    val screenType: MutableLiveData<Int> by lazy { MutableLiveData<Int>() } 

      // 画面の回転をLock、Unlockさせる。
    val rotateLock: MutableLiveData<Int> by lazy { MutableLiveData<Int>() } 

      // true 右開き false 左開き
    val openBookMode: MutableLiveData<Boolean> by lazy { MutableLiveData<Boolean>() } 

 

      // 1枚表示か2枚表示かを保持。外部から_pageModeに書き込みできない仕様
    private var _pageMode = 0
    val pageMode: Int                   // 通常アクセス。読み取り専用
        get() = _pageMode
    
        // 1枚表示か2枚表示かをセットするメソッド
        // 外部から書き込みできないので画面の向きで枚数を決定する
    fun setPageMode(){
        when(screenType.value){
            ActivityInfo.SCREEN_ORIENTATION_PORTRAIT -> {
                _pageMode = 1
            }
            ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE -> {
                _pageMode = 2
            }
            else -> _pageMode = 0
        }
    }

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

 


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