2013-04-11 6 views
1

На экране есть ImageView и настройка GLSurfaceView с параметрами «match_parent». ImageView быстро заполняется и отображается на экране. Затем GLSurfaceView заполняется поверх него с изменениями изображения. Все идет нормально.GLSurfaceView скрывает ImageView нежелательно

Однако эти виды также живут внутри ViewPager с изображениями слева и справа от них. Прежде чем вводить OpenGL Surface View поверх ImageView, представления будут переходить влево и вправо, как ожидалось. Но после введения GLSurfaceView поверх него, как только пользователь начинает прокручивать пальцы, чтобы перейти к следующему изображению, SurfaceView становится прозрачным, что приводит к исчезновению изображения. Он даже заставляет изображение под ним исчезать в ImageView. Отображение фона родительского представления.

Непонятно, как подойти к этой проблеме. Было бы неплохо, если бы текстура скользнула в сторону точно так же, как ImageView, или даже была прозрачной, но оставить ImageView за ней видимым будет хорошо.

Даже GLSurfaceView.RENDERMODE_CONTINUOSLY не сохраняет текстуру во время перехода.

ответ

1

Казалось бы, причина, по которой я не могу добиться эффекта, которого я пытаюсь достичь, состоит в том, что GLSurfaceView всегда помещается за другие виды, вызывая прозрачность в представлении переднего плана. Таким образом, GLSurfaceView будет иметь приоритет перед рисованием. Для достижения эффекта, который я бы хотел, я, вероятно, должен обязательно использовать View.setVisibility() для невидимого при прокрутке и установить его обратно на видимый после того, как ViewPager окупится. Это и есть тот вывод, который я встретил, увидев пару других ссылок в качестве побочного продукта различных исследований.

z-order for GLSurfaceViews

scrolling in GLSurfaceViews

Это не похоже, как будто класс GLSurfaceView действительно выступает как похож на вид, как я изначально ожидал. Поэтому нужно немного позаботиться о том, чтобы продвигаться дальше, чтобы визуализировать визуализацию ImageView между изображениями в ViewPager.

Внутри viewPager мне удалось выполнить что-то в соответствии с приведенным ниже кодом. Конечно, это все еще очень грубо, так как это было в середине тестирования, но оно выполняет то, что я ищу. Что для текстуры начать загрузку, когда мы начнем посещать изображение, а затем исчезнем, показывая исходное изображение под ним, как только пользователь начнет покидать изображение. И это, похоже, работает без разрывов или мерцаний, что я и ожидал бы от этого.

@Override 
public void onPageScrollStateChanged(int state) 
{ 
    switch(state) 
    { 
     case ViewPager.SCROLL_STATE_DRAGGING: 
      Log.i("photoViewer:","dragging ViewPager"); 
      if(photoSurfaceView_ != null && photoViewFrameLayout != null) 
      { 
       photoSurfaceView_.setAlpha(0); 
       photoSurfaceView_.invalidate(); 
      } 
      break; 
     case ViewPager.SCROLL_STATE_IDLE: 
      photoSurfaceView_.setVisibility(View.VISIBLE); 
      photoSurfaceView_.setAlpha(1); 
      Log.i("photoViewer:","idle ViewPager"); 
      break; 
     case ViewPager.SCROLL_STATE_SETTLING: 
      int childCount = photoViewFrameLayout.getChildCount(); 
      if(childCount >= 2) 
      { 
       photoViewFrameLayout.removeViews(1, childCount-1); 
      } 
      new Thread(new Runnable() { 
       @Override 
       public void run() 
       { 
        Looper.prepare(); 
        final Bitmap openGlBitmap = BitmapFactoryUtils.resizeAsNecessaryForOpenGLtexture(photoPaths[photoViewPager_.getCurrentItem()], new BitmapFactory.Options()); 
        Rect bounds = BitmapFactoryUtils.calculateBoundsForBitmap(activityContext, openGlBitmap); 
        int scaledHeight = bounds.height(); 
        int scaledWidth = bounds.width(); 
        photoSurfaceView_ = new PhotoViewSurfaceView(activityContext, openGlBitmap); 
        photoSurfaceView_.setLayoutParams(new LayoutParams(scaledWidth, scaledHeight, Gravity.CENTER)); 
        photoSurfaceView_.setVisibility(View.VISIBLE); 
        photoSurfaceView_.setAlpha(0); 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() 
         { 
          photoViewFrameLayout.addView(photoSurfaceView_); 
         } 
        }); 
       } 
      }).start(); 

      Log.i("photoViewer:","settling ViewPager"); 
      break; 
    } 

Edit: По просьбе я хотел предоставить некоторые дополнительные материалы о том, как изменить размер текстуры для OpenGL SurfaceView, который будет использовать Bitmap для ввода.

Ниже приведен фрагмент кода, доступный для первого шага процесса, при проверке того, будет ли размер текстуры текущего растрового изображения соответствовать одной текстуре. Если вы хотите сфокусировать текстуру, чтобы изображение было больше, тогда это становится более сложным, и это не то, что необходимо для моего разрешения.

Размер текстуры может быть получен с помощью следующего кода:

private void assignTextureSize() 
{ 
    /* The maximum texture size can be found within the OpenGL context and then shared amongst other applications. */ 
    int[] maxTextureSize = new int[1]; 

    GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0); 

    maxTextureSize = maxTextureSize[0]; 
} 

, но только в пределах Renderer класса и для моего случая я ждал, пока в onDrawFrame текстуры сделать задание; пока битмап не назначен ему.

Тогда цель Bitmap, загружаемая для меня, состояла в том, чтобы просто загрузить то, что я мог, без исчерпания памяти. Для этого я просто изменил Options Bitmap, который я собирался загрузить, и попробуйте загрузить его в блок catch try. Если у него закончилась память, я попробую еще раз, но с меньшим размером.

try 
{ 
    final int sizeFactors[] = { 1, 2, 4, 8, 16, 32 }; 

    if (new File(bitmapFilePath).exists()) 
    { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     for (int i = 0; i < sizeFactors.length; ++i) 
     { 
      try 
      { 
       options.inSampleSize = sizeFactors[i]; 
       Bitmap bmp = BitmapFactory.decodeFile(bitmapFilePath, options); 

       if(bmp.getHeight() > maximumTextureSize || 
         bmp.getWidth() > maximumTextureSize) 
       { 
        continue; 
       } 

       /* 
       * @category Check against EXIF data if the image needs to be rotated or not for viewing. 
       */ 
       Matrix matrix = new Matrix(); 
       ExifInterface exif = new ExifInterface(bitmapFilePath); 
       int orientation = exif.getAttributeInt (ExifInterface.TAG_ORIENTATION, 1); 
       switch(orientation) 
       { 
        case ExifInterface.ORIENTATION_NORMAL: 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_90: 
         matrix.postRotate (90); 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_180: 
         matrix.postRotate (180); 
         break; 
        case ExifInterface.ORIENTATION_ROTATE_270: 
         matrix.postRotate (270); 
         break; 
        default: 
       } 

       bmp = Bitmap.createBitmap (bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); 

       return bmp; 
      } catch (OutOfMemoryError outOfMemory) 
      { 
       //Do nothing, it will return when one that doesn't run out of memory is loaded. Or you could do additional checking to bail if needed, etc. 
      } 
     } 
     throw new Exception("Not enough memory for loading image"); 
    } 
} catch (Exception exception) 
{ 
    Log.e("CustomLogTag", "Exception for loading the image that was selected for extraction."); 
} 

Есть много способов сделать это, но это один подход, чтобы взять и я хотел бы добавить ясности и дополнительную информацию к этой предыдущей должности в соответствии с просьбой, так как он не содержит так много информации о моем принятом ответе как Мне тоже хотелось бы.

+0

Вы решили проблему? У меня такая же проблема, но я не могу ее исправить ... – 2015-01-30 14:18:33

+0

@alexlodoss Вышеприведенный код, который я поставил, работал для меня. У меня была фотография с низким разрешением в «ImageView» за «SurfaceView». Итак, когда «ViewPager» взаимодействует, отображается «Bitmap» с низким разрешением, и когда он оседает, я возвращаю «SurfaceView» обратно в видимость. –

+0

Скажите, пожалуйста, когда вы получите класс BitmapFactoryUtils? Я не заметил этого в первый раз ... – 2015-02-02 11:23:16

Смежные вопросы