compose jetpack 橫屏全屏 左右手模式切換


這是正在做的雙色球走勢圖橫屏應(yīng)用,有新進(jìn)展會在這里更新。目的是想知道,完成心中所想,需要多大的努力。這篇文章所實現(xiàn)的功能是,單手握持手機使用這個應(yīng)用時,無倫是左手還是右手握持,都有很好的握持感。經(jīng)過一番努力,基本完成當(dāng)初的設(shè)想。
首先要實現(xiàn)橫屏全屏,這個在這篇文章找到了符合要求的代碼設(shè)置
Android 沉浸式狀態(tài)欄與隱藏導(dǎo)航欄

    public static void NavigationBarStatusBar(Activity activity,boolean hasFocus){
        if (hasFocus && Build.VERSION.SDK_INT >= 19) {
            View decorView = activity.getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }

將這個方法,在onCreate里放一行,在onResume也放一行基本就滿足要求了

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        NavigationBarStatusBar(this)
        setContent {
            Canvas()
        }
    }
    override fun onResume() {
        NavigationBarStatusBar(this)
        super.onResume()
    }
    private fun NavigationBarStatusBar(activity: Activity) {
        val decorView = activity.window.decorView
        decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_FULLSCREEN
                or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
    }
}

難點在于左右手模式順滑地切換,有關(guān)于左右手模式,網(wǎng)上能搜到的資料很少,我費了很大的勁也是一無所獲。就在我要放棄這種設(shè)計模式時,突然一激靈,想到用沒有界面的activity來作為MainActivity,事情一下子就豁然開朗了。(系統(tǒng)默認(rèn)有"@android:style/Theme.NoDisplay"這個主題)
AndroidManifest.xml文件

 <!-- 從沒有界面的activity中啟動應(yīng)用,使界面順滑地切換到左手模式或者右手模式-->
        <activity
            android:name=".NoDisplayActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:screenOrientation="user"    
            android:theme="@android:style/Theme.NoDisplay">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- 左手橫屏模式-->
        <activity
            android:name=".LeftHandModeActivity"
            android:launchMode="singleTop"
            android:screenOrientation="reverseLandscape"
            android:theme="@style/AppTheme.FullScreen">
        </activity>
        <!-- 右手橫屏模式-->
        <activity
            android:name=".RightHandModeActivity"
            android:launchMode="singleTop"
            android:screenOrientation="landscape"
            android:theme="@style/AppTheme.FullScreen">
        </activity>

NoDisplayActivity文件

class NoDisplayActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        //用SharedPreferences保存左右手模式的值
        val sp = getSharedPreferences("scope", 0)
        when (sp.getInt("count", 0)) {
            //右手模式
            0 ->{startActivity(Intent(this, RightHandModeActivity::class.java))}
            //左手模式
            1 ->{startActivity(Intent(this, LeftHandModeActivity::class.java))}
        }
        finish()
    }
}

LeftHandModeActivity 文件,基本是將MainActivity照搬過來,然后添加一些界面代碼。


class LeftHandModeActivity : ComponentActivity() {
    @ExperimentalFoundationApi
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        NavigationBarStatusBar(this)
        
        //有待進(jìn)一步去完善
         val sp = getSharedPreferences("scope", 0)
         val editor = sp.edit()
         editor.putInt("count", 0).apply()
        setContent {
            LottoryTheme {
                // A surface container using the 'background' color from the theme
                Surface(color = MaterialTheme.colors.background) {
                    Scaffold(
                        content = {
                            LeftModeScreen()
                        }
                    )
                }
            }
        }
    }

    override fun onResume() {
        NavigationBarStatusBar(this)
        super.onResume()
    }

    //隱藏導(dǎo)航欄,狀態(tài)欄
    private fun NavigationBarStatusBar(activity: Activity) {
        val decorView = activity.window.decorView
        decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                or View.SYSTEM_UI_FLAG_FULLSCREEN
                or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
    }

}

RightHandModeActivity 文件和LeftHandModeActivity 文件差不多,就不列出來了。界面代碼使用上篇文章的畫板代碼
compose jetpack canvas簡單入門

@Composable
fun LeftModeScreen() {
    Row(modifier = Modifier.fillMaxSize()) {
        //這里是一些行列組合代碼
        MenuColumn()
        Column(
            modifier = Modifier
                .background(Color(34,43,44,50))
                .wrapContentWidth()
        ) {
            //這里是上篇文章的代碼
            LeftModeCanvas()
        }
    }
}

LeftModeCanvas()是上篇文章的代碼, MenuColumn()是一些簡單行列組合代碼,我所寫的代碼還有很多問題,就不貼出來了。
好了,本篇文章就到這里結(jié)束了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容