ImageView 裁剪顶部和底部并固定纵横比

Posted

技术标签:

【中文标题】ImageView 裁剪顶部和底部并固定纵横比【英文标题】:ImageView cropped top and bottom and fixed aspect ratio 【发布时间】:2016-04-06 16:00:49 【问题描述】:

我需要一个具有以下要求的 ImageView:

高度必须是宽度的 50% 图像必须在顶部和底部进行裁剪

所以我需要像 Custom View by JakeWharton 这样的东西和像这样的东西 CropImageView library。但后一个库仅支持centerTopcenterBottom,而不支持两者。

我想为这个问题创建一个自己的 CustomView。但我不知道怎么做。谁擅长实现自定义视图可以给我一些提示如何做到这一点?或者有人知道我可以满足这两个要求的库吗?

【问题讨论】:

不需要任何自定义视图:只需使用 scale type == MATRIX 并设置正确的Matrix 【参考方案1】:

    我使用具有比例高度的自定义 ImageView。在 onMeasure 方法中,实际高度总是替换为与测量宽度成比例的高度。

    public class ImageViewWithProportionalHeight extends ImageView 
    
        private float mProportion;
    
        public ImageViewWithProportionalHeight(Context context, AttributeSet attrs) 
            super(context, attrs);
    
            TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.ProportionalHeight, 0, 0);
            mProportion = attributes.getFloat(R.styleable.ProportionalHeight_heightProportionToWidth, 0);
            attributes.recycle();
        
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
            int width = MeasureSpec.getSize(widthMeasureSpec);
            int height = (int) (width * mProportion);
    
            super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
        
    
    
    

    您当然可以直接在该文件中硬编码比例。为了更加灵活,您可以使用可样式化的属性。然后你需要一个资源 XML 文件来定义你的自定义属性。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="ProportionalHeight">
            <attr name="heightProportionToWidth" format="float" />
        </declare-styleable>
    </resources>
    

    现在您可以使用自定义属性在普通布局 XML 文件中使用视图

    <your.package.name.ImageViewWithProportionalHeight
        android:layout_
        android:layout_
        app:heightProportionToWidth="0.5" />
    

    您可以在 ImageView 上使用 scale type,例如 CENTER_CROP。这不一定只裁剪顶部和底部,而是填充 ImageView 并使图像居中。如果这不是您的解决方案,您应该注意加载到视图中的图像的纵横比。可能是您得到了空白区域

【讨论】:

谢谢,使用自定义的ImageViewCENTER_CROP 实现了我想要的。

以上是关于ImageView 裁剪顶部和底部并固定纵横比的主要内容,如果未能解决你的问题,请参考以下文章

带有约束的标签添加到具有纵横比的 ImageView

Android:拉伸和裁剪图像(但仍然是纵横比)

缩放图像以适应可用空间,同时防止裁剪

如何维护多层 ImageView 并根据最大的一个保持它们的纵横比?

css裁剪图像保存纵横比

ImageView 调整大小并保持纵横比