扭曲Android UI以获得弯曲的屏幕

时间:2016-03-02 08:34:39

标签: android android-layout opengl-es android-theme

我想知道如何将投影仪显示的整个Android UI扭曲(进行几何校正)到曲面屏幕上。

OpenGL是Android平台上的核心库,我知道OpenGL ES允许将每个屏幕框架作为纹理映射到用户定义的网格网格。

如何利用它来转换整个用户界面(跨所有应用和主题),如下图所示?

我也研究了可穿戴设备的API,但这似乎仅限于个别应用,并且不会翘曲。

如果我无法扭曲整个用户界面,那么我想要扭曲并显示来自Android TV HDMI-In的每一帧。 SDK似乎没有利用Open GL。我可以覆盖它并进行转换吗?

Warp screen

1 个答案:

答案 0 :(得分:0)

Google Cardboard做了类似的事情来纠正镜头失真。谷歌尚未正式发布消息来源,但他们在允许的开源许可下发布了二进制文件,因此人们可以自由地反编译它。

大多数魔法发生的类称为DistortionRenderer。基本上,场景被渲染到纹理缓冲区中,然后用于纹理 public class testSearch { public static void main(String[] args){ // input array size from user Scanner input = new Scanner(System.in); System.out.print("Enter array size: "); int size = input.nextInt(); System.out.println(); // create the array (the numbers do not really matter) int[] numbers = new int[size]; for(int i=0; i<numbers.length; i++){ // we want the numbers sorted for binary search // so why not just the numbers 0,1,...,size-1 numbers[i]=i; } // store the time now long startTime = System.nanoTime(); // linear search for size (which is not in the array) linearSearch(numbers,size); // display the time elapsed System.out.println("The time taken by Linear Search is " + (System.nanoTime() - startTime) + "nanoseconds."); // prepare to measure the time elapsed again startTime = System.nanoTime(); // binary search for size binarySearch(numbers,size); // display the time elapsed System.out.println("The time taken by Binary Search is " + (System.nanoTime() - startTime) + "nanoseconds."); } public static boolean linearSearch(int[] a, int key) { for(int i=0; i<a.length; i++){ if(a[i]==key) return true; } return false; } public static boolean binarySearch(int[] a, int key) { int low = 0; int high = a.length -1; int mid; while (low <= high) { mid = (low + high) / 2; if (a[mid]>key) { high = mid - 1; } else if (a[mid]<key) { low = mid + 1; } else { return true; } } return false; } } 。这听起来像是同样的技术对你有用,但是你必须想出自己的方法来生成与投影仪屏幕相对应的失真网格。