Android:使用UIL和TouchImageView时,ImageView未显示

9
我正在尝试使用Universal Image Loader从URL加载图像,并使用TouchImageView Mike Ortiz进行缩放。但是在尝试查看图像时,会显示黑屏。我已经检查过URL是否正确。如果我在那里看到一个TextView... 我做错了什么?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>

编辑

如果我把TouchImageView改为ImageView,它会显示图片。


你现在有解决方案吗?请分享一下,我也遇到了上面的问题。 - BaDo
6个回答

14

我也遇到了这个问题,我发现它与 ProgressBar 的可见性有关,下面的代码可以用来解决它。

  • onLoadingStarted() 中,添加 view.setVisibility(View.GONE)
  • onLoadingComplete() 中,添加 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);
}
});

谢谢亲爱的@cwc,你救了我的一天。 - Parag Chauhan
问题已经解决了,但它与什么有关呢?我感到困惑。 - Gokul Kulkarni

9

我曾经遇到过同样的问题。我通过重置缩放临时解决了这个问题。

touchImage.setZoom(1);

在onLoadComplete()内部

当然,touchImage是您的TouchImageView对象。


1
你的临时解决方案救了我的命。 - Aditay Kaushal

5
如果将 imageView 的 bitmap 异步设置,我发现矩阵是 {0,0,0}{0,0,0}{0,0,1},所以图片不能显示。当 imageView 没有 drawable 并在第一次测量时结束时,TouchImageView.viewWidthTouchImageView.viewHeight都为 0。但当你使用一个非空的 bitmap 设置 setImageBitmap 时,imageView 无法再次测量。TouchImageView.viewWidth此时为 0。请参考以下代码。
    @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();
}

如果您从URL加载图像或从本地加载图像但使用线程的异步模式,则可以按如下方式更改 TouchImageView.OnMeasure
@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();
}

2
我曾经遇到同样的问题。我通过以下方式设置缩放0.99f来解决了这个问题:- imageView.setZoom(0.99f); 其中imageView是TouchImageView的引用。我在ImageLoader中遇到了这个问题,所以我只是将上述行放在onLoadingComplete方法中。您也可以在加载图像url到glide或ImageLoader之前放置相同的行,但最好在加载完成后放置。享受 :)

0

我在使用TouchImageView时遇到了同样的问题,并在GitHub上查找了一些相关的开放问题。如果您仍然想使用TouchImageView,请尝试类似于以下内容:

binding.imageView.load("some URI") {
            transition(CrossfadeTransition(preferExactIntrinsicSize = true))
}

或者我建议您使用com.github.chrisbanes.photoview.PhotoView (implementation 'com.github.chrisbanes:PhotoView:2.3.0')

XML:

<com.github.chrisbanes.photoview.PhotoView
     android:id="@+id/patient_wound_image"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_gravity="center_horizontal"
     android:scaleType="centerCrop"
     tools:srcCompat="@tools:sample/avatars" />

活动或碎片:

binding.dogImage.load("some URI")

后者库提供了Pinch-to-zoom和Double-tap-to-zoom功能,无需任何额外的代码。祝好运!


0

你可以编辑跟踪它,在选项卡2中运行,但其他设备上不行,我不知道为什么。

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

或者你改成这样,它会帮助你显示图片,祝你好运

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

            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接