5

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

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

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

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

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

4

2 回答 2

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;
}
于 2012-10-24T04:25:01.853 回答
1

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

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

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

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

this我们可以使用getAssets()or作为参数来代替getResources()renderer 。
使用getAssets()时,您可以获取保存在 assets 文件夹中的文件,通过使用getResources(),您可以获取放置在项目的资源文件夹中的文件。

于 2012-10-24T05:50:54.440 回答