2017-02-20 41 views
2

我有imageview,它应该只显示图像的一部分(适合部分屏幕的部分)。用户点击后,它会打开整个图像。但我无法弄清楚,如何只将图像的一部分加载到imageview中。问题在于Glide总是将图像放入imageview。如何仅通过Firebase中的Glide加载图像的一部分?

Glide.with(context) 
    .using(new FirebaseImageLoader()) 
    .load(storageReference) 
    .into(imageView); 

它现在是什么样子。红色部分是ImageView。

How it is working now

我多么希望拥有它。

How I would like to have it

编辑

下面的代码将配合,但它展示整体形象,也只是它的一部分,它毁灭的地步。

android:scaleType="fitXY" 
android:adjustViewBounds="true" 

enter image description here

+0

您可以使用simpletarget在更新到imageView之前处理图像 –

+0

任何示例如何? – Michalsx

+0

我更新了答案 –

回答

1

在你的ImageViewXML添加音阶类型。添加此android:scaleType="matrix"

+0

我认为你应该在负值中加上marginRight和marginBottom。 –

+0

android:scaleType =“matrix”是解决方案。我有问题,该图像没有足够的重点来覆盖从一边到另一边显示的图像视图。这可以通过重新采样图像或使用android:scaleY和android:scaleX来处理。 – Michalsx

+0

好的,希望你喜欢我的解决方案。添加你也可以申请我的第二个解决方案。在你的ImageView从右和底部剪切,并给你相同的效果,你想要的。 –

0

只需添加到您的ImageView

android:adjustViewBounds="true" 
    android:scaleType="fitXY" 
+0

这只会使图像适合ImageView,而不会产生任何不需要的背景。但是这个人想要显示图像的一部分。 –

+0

谢谢,但它似乎不是解决方案,你可以在我的问题EDIT中看到。 – Michalsx

+0

您是否尝试过其他缩放类型?像matrix,centercrop等 –

0

添加到这一点你的XML

android:scaleType="fitXY" 
android:adjustViewBounds="true" 
+0

谢谢,但它似乎不是解决方案,你可以在我的问题EDIT中看到。 – Michalsx

+0

你也可以使用android:scaleType =“centerCrop” –

1
Glide.with(mContext) 
       .using(new FirebaseImageLoader()) 
       .load(storageReference) 
       .asBitmap() 
       .diskCacheStrategy(DiskCacheStrategy.SOURCE) 
       .into(new SimpleTarget<Bitmap>() { 
        @Override 
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
         Bitmap targetBitmap = Bitmap.createBitmap(resource, x, y, width, height); 
         imageView.setImageBitmap(targetBitmap); 
        } 
       }); 

在这里,你可以从滑翔根据自己的尺寸调整你的位图。但请确保您提供的尺寸始终小于实际位图。

由于您在列表中使用此代码,应该全局声明Bitmap targetBitmap;以在整个列表中重用相同的位图对象。这将减少您的应用程序的RAM消耗。

与裁剪位图阅读的链接,如果你需要进一步澄清的代码Bitmap targetBitmap = Bitmap.createBitmap(resource, x, y, width, height);

不要忘记将targetBitmap作为全局的,否则内存的影响会太高。

0

好的,感谢Mohammed Atif,Patel Jaimin和Henry,我最终得到了以下解决方案。

<ImageView 
android:id="@+id/ivImage" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:scaleType="matrix"/> 

Glide.with(this) 
     .using(new FirebaseImageLoader()) 
     .load(storageReference) 
     .asBitmap() 
     .into(new SimpleTarget<Bitmap>() { 
     @Override 
     public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
        Bitmap targetBitmap = Bitmap.createBitmap(resource, 0, 0, resource.getWidth(), resource.getHeight()); 
        ivImage.setImageBitmap(targetBitmap); 

        final Matrix matrix = ivImage.getImageMatrix(); 
        final float imageWidth = ivImage.getDrawable().getIntrinsicWidth(); 
        final float scaleRatio = ivImage.getWidth()/imageWidth; 
        matrix.postScale(scaleRatio, scaleRatio); 
        ivImage.setImageMatrix(matrix); 
       } 
      });