你如何缩放像centerCrop这样的ImageView,但是从顶部开始?

时间:2016-07-07 02:37:53

标签: android android-layout imageview scaletype

我们说我从API获取了一些图片。我不知道图像的尺寸会提前是什么,但我知道我希望该图像成为我设置为某个特定尺寸的src的{​​{1}}。我想要从API获得的任何图像来填充整个ImageView,我想保留纵横比,并且我不在乎是否一个尺寸(宽度或高度)对于设定的尺寸而言太大视图 - 所以我使用ImageView

centerCrop

如果从API返回的图像是:

Uncropped, unscaled sample image

当它被设置为<ImageView android:layout_width="400px" android:layout_height="300px" android:scaleType="centerCrop" /> 的src时,结果将类似于此(阴影部分被裁剪掉):

Sample image scaled and cropped with centerCrop

然而,我得到一个请求,我们应该始终显示图像的顶部并从下往上裁剪。所以期望的结果是这样的:

Sample image scaled and cropped from the top

我确信这是可能的,但我是一个在他的联盟中运作的网络人。是以某种方式扩展ImageView,还是尝试ImageViewscaleType="matrix",或者第三个未提及的选项会更好吗?

4 个答案:

答案 0 :(得分:4)

使用此TopCropImageView gist

app.directive('selectOnClick', function ($window, $compile) {
    return {
        link: function (scope, element) {
            element.on('mouseup', function () {    
                if (window.getSelection) {
                    var sel = window.getSelection();
                    var template = '<a href="#" uib-tooltip="hello">'+sel.toString()+'</a>';
                    replaced = element.html().replace(new RegExp(sel.toString(), "g"), template);
                    element.html(replaced);
                    $compile(element.contents())(scope);
                }
            });
        }
    }
});

答案 1 :(得分:2)

如果您使用的是Glide,则可以使用自定义转换。随意使用我的(这是G​​lide的CenterCrop类的几乎完全副本),它占用了百分比:

https://gist.github.com/bjornson/3ff8888c09908d5c6cc345d0a8e1f6a7

像任何其他位图转换一样使用它:

Glide.with(getContext())
    .load(imagePath)
    .transform(new PositionedCropTransformation(getContext(), 1, 0))
    .into(imageView);

急需的价值观: 左上方: 0,0 右上: 0,1 左下方: 1,0 右下: 1,1,

使用0.5f作为中心

答案 2 :(得分:1)

PositionedCropTransformation转换后的代码以支持Glide v4.x https://gist.github.com/bjornson/3ff8888c09908d5c6cc345d0a8e1f6a7

答案 3 :(得分:0)

如果您正在使用Glide,则可以通过以下方式使用optionalTransform:

Glide.with(context).load("http:///...")
            .override(300, 300)
            .optionalTransform(
                  new Transformation<Bitmap>() {
                     @NonNull
                     @Override
                     public Resource<Bitmap> transform(@NonNull Context context, 
                    @NonNull Resource<Bitmap> resource, int outWidth, int outHeight) {
                                       resource.get().setHeight(YOUR_CUSTOM_HIGHT);
                                       return resource;
                                   }

                    @Override 
                    public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {

                                   }
                               }

            )
           into(binding.img);