【发布时间】:2023-03-08 06:39:01
【问题描述】:
我正在使用 OpenGL ES 制作一个 android 动态壁纸,并且我基于教程中的代码 http://www.learnopengles.com/how-to-use-opengl-es-2-in-an-android-live-wallpaper/
我目前正在尝试这样做,以便切换首选项会将纹理换成不同的。我想让它在开始时加载所有纹理,但是有很多纹理,这会花费太长时间(我不能像游戏那样有加载屏幕,所以壁纸必须在一秒钟内加载,这意味着
String imageID = preferences.getString("texture_model", "1");
Log.d("texture change", "changeTexture called with imageID: " + preferences.getString("texture_model", "1"));
Bitmap bmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.girl2crop);
switch(imageID)
{
case "1":
bmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.girl2crop);
Log.d("texture change", "texture 1 called");
break;
case "2":
bmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.girlstudentcrop);
Log.d("texture change", "texture 2 called");
break;
case "3":
bmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.girlbluecrop);
Log.d("texture change", "texture 3 called");
break;
}
// Bind texture to texturename
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texturenames[1]);
GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0,0, bmp);
bmp.recycle();
因为这只能从GL主线程调用,所以我在WallpaperService类中使用了这段代码来调用渲染类中的那个方法:
@Override
public void onVisibilityChanged(boolean visible)
{
super.onVisibilityChanged(visible);
if (visible)
{
glSurfaceView.onResume();
sensorManager.registerListener(this,accelerometer, SensorManager.SENSOR_DELAY_GAME);
Log.d("onResume", "was called on " + glSurfaceView.toString());
} else
{
if(rendererHasBeenSet)
{
glSurfaceView.queueEvent(new Runnable()
{
// This method will be called on the rendering
// thread:
public void run()
{
renderer.refresh();
}
});
glSurfaceView.onPause();
sensorManager.unregisterListener(this);
Log.d("onPause", "was called on " + glSurfaceView.toString());
}
}
}
我遇到的问题是,每次切换首选项时,壁纸都会改变,但只有在壁纸“刷新”后(通过打开另一个应用程序或旋转主页恢复、暂停和再次恢复)屏幕)。这些变化不会立即发生,我需要它们。有谁知道如何解决这个问题,或者有更好的方法来做到这一点?
【问题讨论】: