compose jetpack 横屏全屏 左右手模式切换

2021-03-19  本文已影响0人  随心随弈走

这是正在做的双色球走势图横屏应用,有新进展会在这里更新。目的是想知道,完成心中所想,需要多大的努力。这篇文章所实现的功能是,单手握持手机使用这个应用时,无伦是左手还是右手握持,都有很好的握持感。经过一番努力,基本完成当初的设想。
首先要实现横屏全屏,这个在这篇文章找到了符合要求的代码设置
Android 沉浸式状态栏与隐藏导航栏
    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)
    }
}

难点在于左右手模式顺滑地切换,有关于左右手模式,网上能搜到的资料很少,我费了很大的劲也是一无所获。就在我要放弃这种设计模式时,突然一激灵,想到用没有界面的activity来作为MainActivity,事情一下子就豁然开朗了。(系统默认有"@android:style/Theme.NoDisplay"这个主题)
AndroidManifest.xml文件

 <!-- 从没有界面的activity中启动应用,使界面顺滑地切换到左手模式或者右手模式-->
        <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)
        
        //有待进一步去完善
         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()
    }

    //隐藏导航栏,状态栏
    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()是一些简单行列组合代码,我所写的代码还有很多问题,就不贴出来了。
好了,本篇文章就到这里结束了。

上一篇下一篇

猜你喜欢

热点阅读