首先是一些背景(我总是喜欢当人们提问时):我正在写一个图书馆项目。这是一个简单的OpenGL'图形扭曲'图书馆。用户应该能够创建称为“区域”的特定对象。只需调用
即可myRegion = new DistortedRegion(w,h);
然后定义各种扭曲并绘制它们:
myRegion.addTwistDistortion(...)
myRegion.draw(x,y);
这就是它的全部内容。该库使用OpenGL以各种用户定义的方式绘制区域(真正的矩形位图)。
现在,问题是:库需要访问其顶点和片段着色器,这些着色器是与其资源一起存储的.glsl文件,位于' raw'夹。为了做到这一点,我们必须访问Resources对象,为了做到这一点,我们AFAIK必须拥有Context对象。所以目前看来,首先要通过调用来初始化库
Distorted.init(Context)
这对我来说是一个巨大的问题,因为这个恕我直言使整个API笨拙。如果没有这个该死的上下文,就没有必要初始化任何内容,用户只需要随时就可以创建新对象,这在文档中很容易解释。一个单独的init()调用,只需要将Context对象传递给库,只需要检索Resources对象,只需打开包含着色器代码的两个文件,就会使所有这些都非常笨拙
我想简单地将着色器代码移动到我的库中的静态初始化字符串中,但这对于开发来说很麻烦(着色器是数百行长的相当复杂的代码,如果我将它们保存在单独的.glsl中文件,我可以在其他方面有语法高亮)
有什么建议吗?
答案 0 :(得分:0)
所以是的,我希望能把它搞清楚。这是一个通过反射直接调用底层Android代码来返回当前Application的Context的函数。它可以从任何地方调用,而不仅仅是扩展Application或Activity的类:
import android.content.Context;
import android.app.Application;
import java.lang.reflect.Method;
private Context getCurrentContext()
{
Class<?> cl =null;
Method method =null;
Application app =null;
try
{
cl = Class.forName("android.app.AppGlobals");
}
catch(ClassNotFoundException ex)
{
Log.e(TAG_DISTORTED_REGION, "Failure to retrieve the AppGlobals class: "+ex.toString() );
return null;
}
try
{
method = cl.getMethod("getInitialApplication", (Class [])(null) );
}
catch(NoSuchMethodException nm)
{
Log.e(TAG_DISTORTED_REGION, "No such method: "+nm.toString() );
return null;
}
try
{
app = (Application)method.invoke(null, (Object [])(null) );
}
catch(Exception e)
{
Log.e(TAG_DISTORTED_REGION, "failure calling method getInitialApplication: "+e.toString() );
return null;
}
return app.getApplicationContext();
}