

這是正在做的雙色球走勢圖橫屏應(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é)束了。