使用ConstraintLayout错误调整Picasso的ImageView大小

时间:2018-01-07 17:36:53

标签: android picasso android-constraintlayout

我的布局响应性有问题,问题与Picasso图像大小调整有关。我的空模板(不使用Picasso并将图像插入视图中)如下所示: Before load

当Picasso开始将我的图像加载到中间视图时,它会调整边界(在调整大小和加载时我可以看到空白区域),如下所示:

While loading

下载图像并调整大小后,它会调整约束大小,最后它看起来像这样: enter image description here

Picasso在约束之间留下了自由空间,因为链被设置为内部传播 - 这部分是正常的(当我将其更改为打包时我有相同的空间但在顶部和底部)我只是不想要这个免费毕加索产生的空间。有什么诀窍可以避免这种情况并实现这样的目标吗?也许我做错了什么?

What I want to achieve

我无法静态设置高度,因为我正在动态加载图像而我不知道它们的尺寸。

我尝试了许多选项和黑客,但没有成功。

源代码:

<android.support.constraint.ConstraintLayout
    android:id="@+id/constraintLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:padding="6dp">

    <android.support.constraint.ConstraintLayout
        android:id="@+id/topWrapper"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="@drawable/border"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@+id/middleLayoutImage"
        app:layout_constraintVertical_chainStyle="spread_inside">

        (... not important code int his case ...) 

    </android.support.constraint.ConstraintLayout>

    <ImageView
        android:id="@+id/middleLayoutImage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@drawable/border"
        android:padding="5dp"
        app:layout_constraintBottom_toTopOf="@+id/middleLayoutText"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/topWrapper"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintVertical_chainStyle="spread_inside"/>

    <TextView
        android:id="@+id/middleLayoutText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/border"
        android:padding="5dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/middleLayoutImage"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintVertical_chainStyle="spread_inside"/>

    (... not important code int his case ...)

</android.support.constraint.ConstraintLayout>

毕加索代码:

 ImageView imageView = (ImageView) constraintLayout.findViewById(R.id.middleLayoutImage);
    Picasso.with(imageView.getContext())
            .load(pictureLink)
            .placeholder(R.drawable.load_pixel)
            .fit()
            .centerInside()
            .into(imageView);

感谢您提供帮助。

3 个答案:

答案 0 :(得分:0)

尝试这个,如果有帮助

Picasso  
.with(context)
.load(imageurl)
.resize(600, 200) // resizes the image to these dimensions (in pixel). does not respect aspect ratio
.into(imageViewResize);

答案 1 :(得分:0)

您可以使用Packed的{​​{1}}个线性组。

注意:将TopAlign设置为整个链,置于顶部。

以下是代码:

<强> JAVA

ConstraintLayout

<强> XML

Picasso.with(this).load(inputurl).into(iv);

加载前的布局:

enter image description here

<强>输出

enter image description here

有关链式行为的更多信息https://medium.com/@nomanr/constraintlayout-chains-4f3b58ea15bb

另见官方网页https://developer.android.com/training/constraint-layout/index.html#constrain-chain

答案 2 :(得分:0)

  

我根据设备比例设置了imageview的高度和宽度   使用滑行来加载图像。

     

在布局文件中添加imageview

<ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:scaleType="fitCenter"
                android:adjustViewBounds="true"
                android:layout_marginTop="5dp"/>
  

复制类文件中的以下代码

private void displayImage()
{
    if (!theImagePath.isEmpty()) {
                imageViewScanBusinessCard.setVisibility(View.VISIBLE);
                Display display = getWindowManager().getDefaultDisplay();
                Point size = new Point();
                display.getSize(size);
                int width = size.x - 10;
                imageViewScanBusinessCard.getLayoutParams().height = width / 2;
                imageViewScanBusinessCard.getLayoutParams().width = width;
                imageViewScanBusinessCard.requestLayout();

                File file = new File(theImagePath);
                if (file.exists()) {
                    loadImageWithGlide(this, imageView,
                            theImagePath);
                }
            }
}

    public static void loadImageWithGlide(Context theCtx, ImageView theImageView, String theUrl) {
        Glide.with(theCtx)
                .load(theUrl)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .skipMemoryCache(true)
                .centerCrop()
                .into(theImageView);
    }
  

在app gradle中添加依赖项

compile 'com.github.bumptech.glide:glide:3.7.0'