2014-04-25 11 views
7

sto cercando di implementare le immagini di carico da un URL con Universal Image Loader e zoom con TouchImageView Mike Ortiz. Ma quando si tenta di visualizzare l'immagine, viene visualizzata la schermata nera . Ho controllato che gli URL siano corretti. Io se vedo un TextView lì ...Android: non visualizzato ImageView con Uil e TouchImageView

Cosa sto facendo male?

ImagePagerActivity.java

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.activity_fullscreen_view); 

    Bundle bundle = getIntent().getExtras(); 
    assert bundle != null; 

    String[] imageUrls = bundle.getStringArray("urls"); 
    int pagerPosition = bundle.getInt("pos", 0); 
    tipo = bundle.getString("tipo"); 
    monumento = bundle.getString("monumento"); 
    num = bundle.getInt("num"); 

    for(int i = 0; i < imageUrls.length; i++) { 
     // URLS with data 
     Toast.makeText(this, "URL = " + imageUrls[i], 0).show(); 
    } 

    if (savedInstanceState != null) { 
     pagerPosition = savedInstanceState.getInt(STATE_POSITION); 
    } 

    options = new DisplayImageOptions.Builder() 
     .showImageForEmptyUri(R.drawable.imagen) 
     .showImageOnFail(R.drawable.imagen) 
     .resetViewBeforeLoading(true) 
     .cacheOnDisc(true) 
     .imageScaleType(ImageScaleType.EXACTLY) 
     .bitmapConfig(Bitmap.Config.RGB_565) 
     .considerExifParams(true) 
     .displayer(new FadeInBitmapDisplayer(300)) 
     .build(); 

    pager = (ExtendedViewPager) findViewById(R.id.pager); 
    pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
    pager.setCurrentItem(pagerPosition); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putInt(STATE_POSITION, pager.getCurrentItem()); 
} 

private class ImagePagerAdapter extends PagerAdapter { 

    private String[] images; 
    private LayoutInflater inflater; 

    ImagePagerAdapter(String[] images) { 

     this.images = images; 
     inflater = getLayoutInflater(); 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View) object); 
    } 

    @Override 
    public int getCount() { 
     return images.length; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup view, int position) { 

     final View imageLayout = inflater.inflate(R.layout.ampliar_imagen, view, false); 
     assert imageLayout != null; 

     imageView = (TouchImageView) imageLayout.findViewById(R.id.imagenFullScreen); 

     infoImagen = (LinearLayout)imageLayout.findViewById(R.id.textoInfoImagen); 
     info = (TextView) imageLayout.findViewById(R.id.textoInfoImagenDesc); 

     cargarInfo(position, images); 

     android.graphics.PorterDuff.Mode.MULTIPLY); 

     imageView.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       LinearLayout infoImagen = (LinearLayout)imageLayout.findViewById(R.id.textoInfoImagen); 

       if(infoImagen.getVisibility() == View.GONE) { 
        infoImagen.setVisibility(View.VISIBLE); 
       } else { 
        infoImagen.setVisibility(View.GONE); 
       } 
      } 
     }); 

     imageLoader.displayImage(images[position], imageView, options, new SimpleImageLoadingListener() { 

      @Override 
      public void onLoadingStarted(String imageUri, View view) { 
       spinner.setVisibility(View.VISIBLE); 
      } 

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

       spinner.setVisibility(View.GONE); 
      } 

      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
       spinner.setVisibility(View.GONE); 
      } 
     }); 

     view.addView(imageLayout, 0); 
     return imageLayout; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return view.equals(object); 
    } 

    @Override 
    public void restoreState(Parcelable state, ClassLoader loader) { 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 
} 

private void cargarInfo(int position, String[] images) { 

    if(tipo.equals("fotos")) { 

     info.setText((position + 1) + " de " + images.length + 
       "\n" + InfoImagenes.devolverInfoFotos(monumento, position, num, ImagePagerActivity.this)); 
    } 

    else if(tipo.equals("planos")) { 

     info.setText((position + 1) + " de " + images.length + 
       "\n" + InfoImagenes.devolverInfoPlanos(position, num, ImagePagerActivity.this)); 
    } 
} 

activity_full_screen.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<imagenes.ExtendedViewPager 
    android:id="@+id/pager" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

</LinearLayout> 

ampliar_imagen.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/negro" > 

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

    <imagenes.TouchImageView 
     android:id="@+id/imagenFullScreen" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center" 
     android:adjustViewBounds="true" /> 

    <ProgressBar 
     android:id="@+id/cargandoFoto" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:visibility="gone" /> 
</FrameLayout> 

<LinearLayout 
    android:id="@+id/textoInfoImagen" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:background="@color/grisTransparente" 
    android:orientation="horizontal" 
    android:visibility="visible" > 

    <TextView 
     android:id="@+id/textoInfoImagenDesc" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:gravity="center_horizontal" 
     android:paddingBottom="3dp" 
     android:paddingTop="3dp" 
     android:textColor="@color/blanco" 
     android:textSize="13sp" /> 
</LinearLayout> 

</RelativeLayout> 

EDIT

Se cambio TouchImageView da IMAGEVIEW esso visualizzare l'immagine

+0

Hai una soluzione in questo momento? Per favore condividilo, anche io incontro il problema sopra – BaDo

risposta

0

È possibile modificare seguirlo, trasmessa nella tab2 ma altro dispositivo non è, non so il motivo per cui

private void sharedConstructing(Context context) { 
    super.setClickable(true); 
    this.context = context; 
    ScaleListener scaleListner = new ScaleListener(); //Added 

    mScaleDetector = new ScaleGestureDetector(context, scaleListner); //Edited 
    mGestureDetector = new GestureDetector(context, new GestureListener()); 
    matrix = new Matrix(); 
    prevMatrix = new Matrix(); 
    m = new float[9]; 
    normalizedScale = 1; 
    if (mScaleType == null) { 
     mScaleType = ScaleType.FIT_CENTER; 
    } 
    minScale = 1; 
    maxScale = 3; 
    superMinScale = SUPER_MIN_MULTIPLIER * minScale; 
    superMaxScale = SUPER_MAX_MULTIPLIER * maxScale; 
    setImageMatrix(matrix); 
    setScaleType(ScaleType.MATRIX); 
    setState(State.NONE); 
    onDrawReady = false; 
    scaleListner.onScale(mScaleDetector);//Added 
    super.setOnTouchListener(new PrivateOnTouchListener()); 
} 

o cambiare, vi aiuterà a mostrare l'immagine buona fortuna a voi

ImageLoader.getInstance().displayImage(urlDownload, mImageView, new ImageLoadingListener() { 

      @Override 
      public void onLoadingStarted(String imageUri, View view) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
       // TODO Auto-generated method stub 
       Log.v(TAG, "Bitmap What "+loadedImage.getWidth()+ " "+loadedImage.getHeight()); 


      } 

      @Override 
      public void onLoadingCancelled(String imageUri, View view) { 
       // TODO Auto-generated method stub 

      } 
     }); 
14

ho anche incontrato questo problema, ho trovato che è relativo alla visibilità di ProgressBar e il seguente codice può essere utilizzato per risolverlo.

  • In onLoadingStarted(), aggiungere view.setVisibility(View.GONE)
  • In onLoadingComplete(), aggiungere il codice view.setVisibility(View.VISIBLE)

:

imageLoader.displayImage(imageUri.toString(), 
        mPictureView, 
        options, 
        new SimpleImageLoadingListener() 
{ 
@Override 
public void onLoadingStarted(String imageUri, View view) 
{ 
    spinner.setVisibility(View.VISIBLE); 
    view.setVisibility(View.GONE); 
} 

@Override 
public void onLoadingFailed(String imageUri, View view, FailReason failReason) 
{ 
    spinner.setVisibility(View.GONE); 
} 

@Override 
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) 
{ 
    spinner.setVisibility(View.GONE); 
    view.setVisibility(View.VISIBLE); 
} 
}); 
+0

hai salvato la mia giornata – marson

+0

Grazie cara @cwc hai salvato la mia giornata. Il problema –

+0

è corretto, ma come è correlato? m confuso –

8

Ho avuto lo stesso problema. Ho temporaneamente risolto il problema reimpostando lo zoom.

touchImage.setZoom(1); 

all'interno onLoadComplete()

Naturalmente touchImage è il vostro oggetto TouchImageView.

+1

la tua soluzione temporanea mi ha salvato la vita –

+0

@AditayKaushal Amo salvare vite con il codice. – Edoardoo

4

se set imageView bitmap asincrona, ho trovato matrice è {0,0,0} {0,0,0} {0,0,1}, quindi l'immagine non può essere mostrata .. quando imageView che ha un null drawable la misura finita al primo momento, TouchImageView.viewWidth e TouchImageView.viewHeight è 0. ma quando si imposta ImageBitmap usando una bitmap null !, l'immagine non può essere misurata nuovamente. TouchImageView.viewWidth è 0 in questo momento. Guarda il seguente codice.

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    Drawable drawable = getDrawable(); 
    if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0)  { 
     setMeasuredDimension(0, 0); 
     return; 
    } 

    int drawableWidth = drawable.getIntrinsicWidth(); 
    int drawableHeight = drawable.getIntrinsicHeight(); 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 
    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    viewWidth = setViewSize(widthMode, widthSize, drawableWidth); 
    viewHeight = setViewSize(heightMode, heightSize, drawableHeight); 

    // 
    // Set view dimensions 
    // 
    setMeasuredDimension(viewWidth, viewHeight); 

    // 
    // Fit content within view 
    // 
    fitImageToView(); 
} 

se si carica un'immagine URL o caricare immagini da modalità asincrona locale, ma l'utilizzo da filo da, è possibile modificare TouchImageView.OnMeasure come segue ..

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    Drawable drawable = getDrawable(); 
//  if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0) { 
////   setMeasuredDimension(0, 0); 
//   
//   super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
//   return; 
//  } 

    int drawableWidth = drawable == null ? 0 : drawable.getIntrinsicWidth(); 
    int drawableHeight = drawable == null ? 0 : drawable.getIntrinsicHeight(); 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 
    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    viewWidth = setViewSize(widthMode, widthSize, drawableWidth); 
    viewHeight = setViewSize(heightMode, heightSize, drawableHeight); 

    // 
    // Set view dimensions 
    // 
    setMeasuredDimension(viewWidth, viewHeight); 

    // 
    // Fit content within view 
    // 
    fitImageToView(); 
} 
+0

Anche questo funziona con ** Glide **, grazie! – Tomas

0

Lo stesso problema che stavo affrontando. Ho risolto il problema impostando lo zoom 0.99f come segue: - imageView.setZoom (0,99 f);

dove IMAGEVIEW è riferimento TouchImageView. Stavo affrontando questo problema in ImageLoader, quindi ho appena inserito la riga sopra nel metodo onLoadingComplete. Si può anche mettere la stessa linea prima di caricare l'URL dell'immagine di glide o ImageLoader ma meglio metterlo dopo carico completo. Divertiti :)