【问题标题】:Updating OpenGL ES 2.0 Textures on Preference Change在首选项更改时更新 OpenGL ES 2.0 纹理
【发布时间】: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());
          }
      }
  }

我遇到的问题是,每次切换首选项时,壁纸都会改变,但只有在壁纸“刷新”后(通过打开另一个应用程序或旋转主页恢复、暂停和再次恢复)屏幕)。这些变化不会立即发生,我需要它们。有谁知道如何解决这个问题,或者有更好的方法来做到这一点?

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    因此,看起来立即生效的唯一方法是将 queueEvent 方法放在 onresume 方法之后。想到这里,我觉得很有道理。

      @Override
      public void onVisibilityChanged(boolean visible)
      {
          super.onVisibilityChanged(visible);
              if (visible)
              {
                  glSurfaceView.onResume();
                  glSurfaceView.queueEvent(new Runnable()
                  {
                      // This method will be called on the rendering
                      // thread:
                      public void run()
                      {
                          renderer.refresh();
                      }
                  });
                  sensorManager.registerListener(this,accelerometer, SensorManager.SENSOR_DELAY_GAME);
                  Log.d("onResume", "was called on " + glSurfaceView.toString());
              } else
              {
                  if(rendererHasBeenSet)
                  {
                  glSurfaceView.onPause();
                  sensorManager.unregisterListener(this);
                  Log.d("onPause", "was called on " + glSurfaceView.toString());
              }
          }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2012-03-29
      相关资源
      最近更新 更多