分享图片元素过渡显示尺寸不正确

Posted

技术标签:

【中文标题】分享图片元素过渡显示尺寸不正确【英文标题】:Share Image element transition display incorrect size 【发布时间】:2017-01-12 15:25:09 【问题描述】:

我有一个回收视图来显示所有照片缩略图项目。当单击项目时,我使用此项目中的图像视图转换为详细信息活动。问题是图像源是由UIL 从互联网获取的。并且有时(并非总是)图像不会重新加载正确的尺寸,如下所示:

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

详细活动

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

片段详情

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_
    android:layout_
    >

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

我什至在加载图像之前等待视图布局但仍然不起作用:

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

有什么办法可以避免这个问题?

【问题讨论】:

您正在使用 centerCrop 可能是尝试使用不同比例类型的问题。 @Himani 好吧,我必须使用,因为照片必须适合屏幕并保持比例。但是您对 scaletype 错误有任何线索吗?它确实适用于许多情况,但有时看起来图像还没有准备好 然后使用 FITXY 来缩放类型 @Himani 首先,fitXY 不保持比例方面。第二,还是不行。 @R4j,你提前知道源图片的纵横比吗?我对图像有类似的问题。但就我而言,我事先知道图像的纵横比,即 2:3 。所以我有一个图像视图,在其中我根据设备屏幕大小在运行时动态更改图像视图尺寸。如果这是您的要求,我可以发布这样做的代码。 【参考方案1】:

这个xml可以处理不同的图片尺寸

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

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

            <LinearLayout
                android:layout_
                android:layout_ >

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

在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);
    

【讨论】:

我的问题是过渡问题,而不是图像缩放。您的代码只是缩放图像以适应屏幕高度。

以上是关于分享图片元素过渡显示尺寸不正确的主要内容,如果未能解决你的问题,请参考以下文章

js怎么实现一段文字的显示有个明显的过渡效果

CSS入门(背景各种属性的详解垂直居中和过渡效果的详解渐变效果的简单讲解)

部分卷曲过渡导致控件调整大小

如何在 Vue 转换开始之前读取大小并移动隐藏元素?

如果元素开始隐藏,css 过渡不起作用

组件或者标签要使用过渡效果,必须使用啥标签