2014-04-25 8 views
7

Ich versuche, Bilder von einem URL mit Universal Image Loader und zoom mit TouchImageView Mike Ortiz zu implementieren. Wenn Sie jedoch versuchen, das Bild anzuzeigen, wird schwarzer Bildschirm angezeigt. Ich habe überprüft, dass die URLs korrekt sind. Wenn ich dort einen TextView sehe ...Android: nicht angezeigt ImageView mit UIL und TouchImageView

Was mache ich falsch?

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

Wenn ich TouchImageView ändern, indem Image es um das Bild anzuzeigen

+0

Hattest du gerade eine Lösung? Bitte teilen Sie es, ich bin auch treffen oben Problem – BaDo

Antwort

0

Sie können es bearbeiten folgen, führen Sie es in tab2 aber ein anderes Gerät ist es nicht, ich weiß nicht, warum

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()); 
} 

oder Sie ändern, es wird Ihnen helfen, das Bild zeigen, zu viel Glück Sie

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

ich fand auch dieses Problem begegnet, ich es ist im Zusammenhang mit ProgressBar Sichtbarkeit, und der folgende Code kann verwendet werden, um es zu lösen.

  • In onLoadingStarted(), fügen view.setVisibility(View.GONE)
  • In onLoadingComplete(), fügen view.setVisibility(View.VISIBLE)

Code:

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

Sie gespeichert meinen Tag – marson

+0

Vielen Dank liebe @cwc hast du meinen Tag gerettet. –

+0

Problem ist behoben, aber wie ist es zusammen? m verwirrt –

8

Ich habe das gleiche Problem hatte. Ich habe das Problem vorläufig behoben, indem ich den Zoom zurückgesetzt habe.

touchImage.setZoom(1); 

innen onLoadComplete()

Natürlich touchImage ist Ihr TouchImageView Objekt.

+1

Ihre temporäre Lösung rettete mein Leben –

+0

@AditayKaushal Ich liebe es, Leben mit Code zu retten. – Edoardoo

4

Wenn Bild imageView Bitmap async gesetzt ist, fand ich Matrix ist {0,0,0} {0,0,0} {0,0,1}, so dass Bild nicht gezeigt werden kann .. wenn imageView, die eine Null zeichnen können Die erste Messung ist TouchImageView.viewWidth und TouchImageView.viewHeight ist 0. Wenn Sie jedoch ImageBitmap mit einer! null-Bitmap setzen, kann imageView nicht erneut gemessen werden. TouchImageView.viewWidth ist zu diesem Zeitpunkt 0.siehe folgenden Code.

@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(); 
} 

, wenn Sie Bild von einer URL oder der Last Bild laden aus lokalem, aber Verwendung asynchronen Modus durch Gewinde, können Sie TouchImageView.OnMeasure wie folgt ändern ..

@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

Das funktioniert auch mit ** Glide **, danke! – Tomas

0

Das gleiche Problem, mit dem ich konfrontiert wurde. Ich habe das Problem gelöst, indem ich Zoom 0.99f wie folgt eingestellt habe: - imageView.setZoom (0.99f);

Dabei ist imageView eine Referenz von TouchImageView. Ich war in ImageLoader mit diesem Problem konfrontiert, also habe ich einfach die obige Zeile in onLoadingComplete Methode gesetzt. Sie können auch die selbe Zeile vor dem Laden der Image-URL auf glide oder ImageLoader setzen, aber besser, es nach zu setzen, laden Sie. Viel Spaß :)