MonoBehaviour生命周期
MonoBehaviour生命周期Unity 中的 MonoBehaviour 类提供了一系列的回调方法,这些方法按照一定的顺序被调用,形成了脚本的生命周期。了解这些生命周期方法对于控制游戏对象的行为非常重要。以下是 MonoBehaviour 的主要生命周期方法: Awake(): 当脚本实例被加载时调用。这个方法在整个游戏生命周期中只调用一次,通常用于初始化变量或游戏状态。 OnEnable(): 当对象变为可用或激活状态时调用。当一个对象从非激活状态转为激活状态(比如通过设置 gameObject.SetActive(true))时会调用此方法。每次对象变得可用时都会调用。 Start(): 在第一次帧更新之前调用。仅在启用状态下才会被调用,常用于需要等待所有初始化完成后再执行的操作。 FixedUpdate(): 固定物理更新频率调用。用于处理物理相关的计算,因为它的调用不受帧率的影响。 Update(): 每帧调用一次。这是使用最频繁的方法之一,适合用于处理与帧率同步的游戏逻辑。 LateUpdate(): 在每帧Update方法之后调用。主要用于处理跟随摄...
EdgeToEdge全屏状态和导航栏高度适配
EdgeToEdge全屏状态和导航栏高度适配12345ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets -> val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) insets}
scrcpy不重定向到电脑声卡
scrcpy不重定向到电脑声卡1scrcpy --render-driver=software --no-audio
Android刷机
Android刷机对于安卓设备的刷机过程,通常会涉及到使用ADB(Android Debug Bridge)和Fastboot工具。以下是基于命令行操作的刷机步骤及对应指令: 准备工作 确保已安装ADB和Fastboot:你需要在电脑上安装ADB和Fastboot工具。 解锁Bootloader(如果需要):不同的制造商有不同的解锁方法,请查阅官方文档或社区指南。 刷机步骤及对应指令 连接设备并启用调试模式 在设备上进入“设置”->“关于手机”,连续点击版本号激活开发者选项。 返回设置主菜单,进入开发者选项,启用USB调试。 使用USB线将设备连接到电脑。 检查设备是否正确连接 1adb devices 确认可以看到你的设备。 重启设备进入Bootloader模式 1adb reboot bootloader 确认设备处于Fastboot模式 1fastboot devices 解锁Bootloader(如果尚未解锁) 注意:这一步会清除设备上的所有数据。1fastboot oem unlock 具体指令可能因设备而异,请参照设备制造商提供的说明。 刷入...
关于Gradle版本配置
关于Gradle版本配置✅ 项目里“真正被 Gradle 选中参与构建”的所有依赖👉 都会被下载到 .gradle/caches 下 ✅ 这些依赖的“具体版本”👉 最终来自:第三方库自身的版本声明 + Gradle 的依赖解析结果 老项目 AGP -> 最高7.4.2, gradle-7.5-bin JVM -> 11及以下 新项目 AGP -> 8.0.0及以上, 最低gradle-8.0-bin推荐:2024 AGP:8.3.2 gradle:8.4-bin以上 kotlin:1.9.20 JVM -> 17及以上 需要配置namespace 关于Kotlin AGP 推荐 Kotlin 7.4.x 1.7.20 8.0.x 1.8.10 8.1.x 1.8.20 8.2.x 1.9.0 8.3.x 1.9.20
如何设置菜单
为了优化 onActivityCreated 和 onCreateOptionsMenu 并避免使用过期方法,建议采用以下现代 Android 开发实践: 移除 onActivityCreated:该方法已弃用。原本在其中调用的 setHasOptionsMenu(true) 也可以移除。 使用 MenuProvider API:这是替代 onCreateOptionsMenu 和 onOptionsItemSelected 的推荐方式,它能更好地与生命周期结合。 123456789101112131415161718192021222324252627282930313233private fun setupMenu() { val menuHost: MenuHost = requireActivity() menuHost.addMenuProvider(object : MenuProvider { override fun onCreateMenu( menu: Menu, ...
调节对比度
调节对比度要通过代码调整Android屏幕对比度,您可以使用以下方法: 使用WindowManager.LayoutParams设置屏幕亮度和对比度: 1234WindowManager.LayoutParams layoutParams = getWindow().getAttributes();layoutParams.screenBrightness = 1.0f; //设置屏幕亮度layoutParams.contrast = 1.5f; //设置对比度getWindow().setAttributes(layoutParams); 通过Settings.System类使用ContentResolver设置系统对比度: 123ContentResolver cr = getContentResolver();Settings.System.putInt(cr, Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); //设置手动调节屏幕亮度Setti...
查询本地图片资源
查询本地图片资源12345678910111213141516171819202122232425262728293031val mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URIval mContentResolver = contentResolverval cursor: Cursor?val projection = arrayOf( MediaStore.MediaColumns._ID, MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.DATE_MODIFIED)//只查询jpeg和png的图片cursor = mContentResolver.query( mImageUri, projection, MediaStore.MediaColumns.MIME_TYPE + "=? or " + MediaStore....
ViewModel在Activity和Fragment之间共享
ViewModel在Activity和Fragment之间共享在 Android 的 Jetpack ViewModel 架构组件中: 在 Activity 中使用 by viewModels() 创建的 ViewModel,默认作用域是该 Activity。 在 Fragment 中使用 by activityViewModels() 创建的 ViewModel,其作用域也是 宿主 Activity。 因此,只要 ViewModel 的类型相同,并且使用的是默认的 Factory 和 key(即没有自定义 key),那么无论你是在 Activity 中通过 viewModels() 还是在 Fragment 中通过 activityViewModels() 获取,它们都会共享同一个 ViewModel 实例。 原理简述ViewModel 是通过 ViewModelStoreOwner 来管理生命周期和存储的。 Activity 是一个 ViewModelStoreOwner。 viewModels() 在 Activity 中会从 Activity 自己的 Vie...
更新当前的选中状态
更新当前的选中状态123456789101112131415161718192021222324252627282930313233private fun updateSelectStatus(curUser: User) { mAdapter.run { var targetPosition = -1 var previousCheckedPosition = -1 // 遍历一次,同时更新状态并记录位置 data.forEachIndexed { index, user -> val wasChecked = user.isChecked val shouldBeChecked = (user.uid == curUser.uid) if (wasChecked != shouldBeChecked) { user.isChecked = shouldBeChecked ...