在Unity中调整安卓当前窗口屏幕亮度的实现(无需导出工程或制作插件)
来源:互联网 发布:淘宝退货运费理赔 编辑:程序博客网 时间:2024/06/05 18:00
由于我要在程序中实现改变屏幕亮度,可是在网上一找,全是要先导出为安卓工程,或者是创建插件,这些都太烦了。
其实Unity提供了一个很好的和安卓交互的接口,根本不需要另作设置。理论上,只要有安卓代码,都可以在Unity中实现。
先送上调整亮度代码:(已修复)
void SetApplicationBrightnessTo(float Brightness) { AndroidJavaObject Activity = null; Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"); Activity.Call("runOnUiThread", new AndroidJavaRunnable(() => { AndroidJavaObject Window = null, Attributes = null; Window = Activity.Call<AndroidJavaObject>("getWindow"); Attributes = Window.Call<AndroidJavaObject>("getAttributes"); Attributes.Set("screenBrightness", Brightness); Window.Call("setAttributes", Attributes); })); }
调用方法:
直接调用,如:
SetApplicationBrightnessTo(0.01f);
Brightness的有效范围是0~1,-1。 若设置为-1则跟随系统亮度。本段代码没有设置有效范围检测。
稍作讲解:
无论在安卓里是什么复杂的类,在Unity都有统一的对象 : AndroidJavaObject
首先要获取当前Activity :
AndroidJavaObject Activity = null;Activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
根据我在网上查找的资料,获得了安卓代码:
Window window = activity.getWindow();WindowManager.LayoutParams lp = window.getAttributes();lp.screenBrightness = brightness;window.setAttributes(lp);
正如上面提到的,一切对象都可以用AndroidJavaObject来承载,所以我通过查阅UnityAPI和资料,可以转换上面的代码为:
AndroidJavaObject Window = null, Attributes = null;Window = Activity.Call<AndroidJavaObject>("getWindow");Attributes = Window.Call<AndroidJavaObject>("getAttributes");Attributes.Set("screenBrightness", Brightness);Window.Call("setAttributes", Attributes);
您不免有些疑问了,那么
Activity.Call("runOnUiThread", new AndroidJavaRunnable(() => { ...... }
这些东西是什么呢?
是因为Unity的“主线程”和本身App的主线程并不是同一个,也就是说,如果我们不加这个,就会跨线程修改UI Thread(即安卓主线程),这是不允许的。会出现以下报错:
AndroidJavaException: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
所以我们需要将一段程序通过Activity的runOnUiThread方法传递给主线程执行,Java中的Runnable也有对应的接口:AndroidJavaRunnable。使用Lambda表达式把代码传递给参数。
由此则可以完美实现修改亮度,希望可以帮助到大家,转载请注明出处。
阅读全文
2 1
- 在Unity中调整安卓当前窗口屏幕亮度的实现(无需导出工程或制作插件)
- 在Unity中获取、修改安卓设备系统亮度与Activity亮度
- BlueStacks安卓模拟器屏幕窗口大小的调整方法
- BlueStacks安卓模拟器屏幕窗口大小的调整方法
- android屏幕亮度的调整
- android屏幕亮度的调整
- 调整屏幕亮度的方法
- 安卓修改系统的屏幕亮度
- Windows Phone 调整屏幕亮度的简单实现
- Mint linux中调整屏幕亮度的方法
- iOS获取屏幕亮度和调整屏幕亮度的方法
- Qt5:Qt中屏幕或窗口截图功能的实现
- 【Unity Shader入门练习】调整屏幕的亮度、饱和度和对比度
- 无需遮罩,在AE中制作画圆或圆圈的动画
- Unity Shader 学习笔记(19) 屏幕后处理效果、调整亮度、饱和度、对比度
- linux 笔记本调整屏幕亮度的方法
- 如何调整Ubuntu的屏幕亮度
- win10屏幕亮度无法调整的原因
- 一步一步学ROP之Android ARM 32位篇 -- 阅读笔记及实践
- JavaScript对Json的增删改属性
- SSM框架详细整合教程
- 如何使用 Java 中的数组
- [MyEclipse手册]JSP、HTML页面排版
- 在Unity中调整安卓当前窗口屏幕亮度的实现(无需导出工程或制作插件)
- June Challenge 2017 | Chef and the Feast
- cookie session的共同点和区别
- JS
- SSL 延迟与 Http、Https
- JAVA中反射的基本调用方式
- POJ 1953 World Cup Noise 笔记
- linux下清屏以及休眠函数的调用
- Gralloc 总结