如何在GLWallpaper服务中加载资源或资产

时间:2012-10-19 06:36:22

标签: android opengl-es live-wallpaper

我正在尝试使用OpenGL壁纸服务开发Android动态壁纸,我可以像Mark F Guerra一样创建动态壁纸example但我想要添加一些精灵动画到我的壁纸。

我已在另一个项目中创建了OpenGL ES精灵动画。我只是想在动态壁纸项目中重新创建我的动画。

但在我的动态壁纸项目中,我无法获取Context并从资源或资源加载我的图片

关于使用glwallpaper服务时加载资源或资产文件的任何建议或示例代码或链接将非常有帮助。

欢迎所有建议和/或示例代码。

2 个答案:

答案 0 :(得分:1)

将引擎中的上下文传递给渲染器。然后,这里是一些加载资产的示例代码。即resourceID是您的R.drawable.xxx位图。我在我制作的纹理图集类中有这个,所以方法中可能没有完全包含一些东西。例如,我可能用于加载位图的选项将包括inscaled = false,但任何适合您的选项。我还修改了这个来删除我的错误处理。

/**
 * Load the resource and push it to the gpu memory, setup default values
 * @param gl
 * @param context
 * @param resourceID
 * @return glTextureID
 * 
 */
public int loadFromContext(GL10 gl, Context context, int resourceID) {
    mResourceID = resourceID;
    Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), resourceID, sBitmapOptions);
    sourceWidth = bmp.getWidth();
    sourceHeight = bmp.getHeight();
    gl.glGenTextures(1, mGLTextures, 0);
    mGLTextureID = mGLTextures[0];

    // bind and set min and mag scaling to bilinear
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mGLTextureID);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

    // repeat by default
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

    // upload bmp to video memory
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);

    // check error
    int error = gl.glGetError();
    if (error != GL10.GL_NO_ERROR) {
        // cleanup
        bmp.recycle();
        bmp = null;
        mLoaded = false;
            // error handling here
    } else {

        // unbind.
        gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
        bmp.recycle();
        bmp = null;
        mLoaded = true;
        mDirty = true;

      } 
      return mGLTextureID;
}

答案 1 :(得分:1)

我们可以使用如下所示的上下文。

in wallpaper service class: 
------------------- 
renderer = new GlRenderer(this); 

in renderer class: 
---------------- 
private Context context; 

public GlRenderer(Context context) { 
this.context = context; 

我们可以使用thisgetAssets()作为渲染器的参数而不是getResources()
使用getAssets()时,您可以获取保存在assets文件夹中的文件通过使用getResources(),您可以获取放置在项目的resources文件夹中的文件。