9

Mam widok kosza, aby wyświetlić wszystkie elementy miniatur zdjęć. Po kliknięciu elementu używam przejścia dla widoku obrazu w tym elemencie do działania Szczegóły. Problem polega na tym, że źródło obrazu jest pobierane z Internetu przez UIL. I kiedyś (nie zawsze) obrazy nie przeładować prawidłowy rozmiar tak:Udostępnianie Wyświetl element przejścia wyświetlania nieprawidłowy rozmiar

transition error

// on view holder item click 
    final Pair<View, String>[] pairs = TransitionHelper.createSafeTransitionParticipants(this, false, 
        new Pair<>(((ItemViewHolder) viewHolder).thumbnail, getString(R.string.TransitionName_Profile_Image)), 
        new Pair<>(((ItemViewHolder) viewHolder).tvName, getString(R.string.TransitionName_Profile_Name))); 

    ActivityOptionsCompat transitionActivityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pairs); 
    startActivityForResult(intent, requestCode, transitionActivityOptions.toBundle()); 

aktywność Szczegóły

// try to post pone transition until UIL load finish 
ActivityCompat.postponeEnterTransition(this); 
getSupportFragmentManager().beginTransaction().replace(R.id.layoutContent, new DetailFragment()).commit(); 

Fragment Szczegóły

ImageLoader.getInstance().displayImage(url, imageViewDetail, new ImageLoadingListener() { 
       @Override 
       public void onLoadingStarted(String imageUri, View view) { 

       } 

       @Override 
       public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
        finishAnimation(); 
       } 

       @Override 
       public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 

        finishAnimation(); 
       } 

       @Override 
       public void onLoadingCancelled(String imageUri, View view) { 
        finishAnimation(); 
       } 
      }); 


private void finishAnimation(){ 
    ActivityCompat.startPostponedEnterTransition(getActivity()); 
    imageViewDetail.invalidate(); 
} 

fragment_detail.xml

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 

    <ImageView 
     android:transitionName="@string/TransitionName.Profile.Image" 
     android:id="@+id/imageViewDetail" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:adjustViewBounds="true" 
     android:scaleType="centerCrop"/> 
</FrameLayout> 

nawet czekać poglądy są rozplanowane przed załadowaniem obrazu, ale nadal nie działa:

imageViewDetail.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
      @Override 
      public boolean onPreDraw() { 
       // code load image from UIL 
       return false; 
      } 
     }); 

Czy istnieje jakiś sposób, aby uniknąć tego problemu?

+0

Jesteś użycie centerCrop może to jest to kwestia spróbuj innego typu skalę. –

+0

@Himani dobrze, muszę użyć, ponieważ zdjęcie musi pasować do ekranu i zachować wskaźnik. Ale czy masz jakąś wskazówkę na temat błędu scaletype? ** działa w wielu przypadkach **, ale czasami wygląda jak obraz nie jest gotowy – R4j

+0

następnie użyj FITXY do scaletype –

Odpowiedz

0

ten xml może obsłużyć Diferent wielkości wyświetlanego obrazu

<ScrollView 
     android:id="@+id/vScroll" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_marginBottom="51dp" 
     android:scrollbars="none" > 

     <HorizontalScrollView 
      android:id="@+id/hScroll" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scrollbars="none" 
      android:layout_gravity="center"> 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" > 

       <ImageView 
        android:id="@+id/imgFullscreen" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:scaleType="fitXY" /> 
      </LinearLayout> 
     </HorizontalScrollView> 
    </ScrollView> 

w java

fullImageView = (ImageView) findViewById(R.id.imgFullscreen); 
selectedPhoto = (FeedItem) i.getSerializableExtra(TAG_SEL_IMAGE); 
     zoom = 1; 

     if (selectedPhoto != null) { 
      fetchFullResolutionImage(); 
     } else { 
      Toast.makeText(getApplicationContext(), 
        getString(R.string.msg_unknown_error), Toast.LENGTH_SHORT) 
        .show(); 
     } 



private void fetchFullResolutionImage() { 
    try { 
     final URL url = new URL(selectedPhoto.getImge());  
     new Thread(new Runnable() { 

      @Override 
      public void run() { 
       try { 
        Bitmap bmp = BitmapFactory.decodeStream(url 
          .openStream()); 
        if (bmp != null) 
         setImage(bmp); 
        else { 
         showToast("Error fetching image!"); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
private void setImage(final Bitmap bmp) { 
     runOnUiThread(new Runnable() { 
      public void run() { 
       fullImageView.setImageBitmap(bmp); 
       adjustImageAspect(selectedPhoto.getWidth(), 
         selectedPhoto.getHeight()); 
      } 
     }); 
    } 
private void adjustImageAspect(int bWidth, int bHeight) { 
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
       LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
     if (bWidth == 0 || bHeight == 0) 
      return; 
     int swidth; 

     if (android.os.Build.VERSION.SDK_INT >= 13) { 
      Display display = getWindowManager().getDefaultDisplay(); 
      Point size = new Point(); 
      display.getSize(size); 
      swidth = size.x; 
     } else { 
      Display display = getWindowManager().getDefaultDisplay(); 
      swidth = display.getWidth(); 
     } 

     int new_height = 0; 
     new_height = swidth * bHeight/bWidth; 
     params.width = swidth; 
     params.height = new_height; 
     saveW = swidth; 
     saveH = new_height; 
     fullImageView.setLayoutParams(params); 
    } 
+0

Moim problemem jest problem z przesuwaniem, a nie skalowanie obrazu. Twój kod po prostu skaluje obraz, aby dopasować go do wysokości ekranu. – R4j

Powiązane problemy