Android: not displayed ImageView with UIL and TouchImageView

走远了吗. 提交于 2019-11-30 13:10:47
cwc

I also met this problem, I found it is related with ProgressBar's visibility, and the following code can be used to solve it.

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

I've had the same issue. I've temporary solved the problem by resetting the zoom.

touchImage.setZoom(1);

inside onLoadComplete()

Of course touchImage is your TouchImageView object.

if set imageView bitmap async , i found matrix is {0,0,0}{0,0,0}{0,0,1} ,so image cannot be showed.. when imageView that have a null drawable finished measure at first time, TouchImageView.viewWidthand TouchImageView.viewHeight is 0 .but when you setImageBitmap using a !null bitmap,the imageView cannot be measured again.TouchImageView.viewWidth is 0 at this time.see following 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();
}

if you load image from url or load image from local but use async mode by thread,you can change TouchImageView.OnMeasure as follows..

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

Same problem I was facing. I have solved the problem by setting zoom 0.99f as follows:- imageView.setZoom(0.99f);

where imageView is reference of TouchImageView. I was facing this problem in ImageLoader, so I just put the above line in onLoadingComplete method. You can also put the same line before loading the image url to glide or ImageLoader but better to put it after loading complete. Enjoy :)

You can edit follow it, It run in tab2 but other device is not, I don't know why

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

or you change to, it will help you show the image, good luck to you

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

            }
        });
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!