【问题标题】:Cropp Image to fit ImageView based on X axis基于 X 轴裁剪图像以适合 ImageView
【发布时间】:2016-04-09 12:44:42
【问题描述】:

如图所示,我们有两种类型的ImageView,一种是Horizontal,另一种是Vertical。我们希望以位图填充 ImageView 的方式将图像加载到它们,图像可以更小(如图像#1)或更大更高(如图像#2)。

我们的目标是如图所示,我们想在X-Axis 上缩放图像并在Y-Axis 中裁剪溢出的drawable

我们几乎尝试了所有scale-type,但结果并不让我们满意,很遗憾

【问题讨论】:

  • 您想缩放图像宽度以查看图像宽度并裁剪图像的垂直端,对吧?

标签: android image imageview android-imageview


【解决方案1】:

如果你想让drawable的宽度与ImageView的宽度匹配,你可以使用Matrix:

public Matrix scaleWidthMatrix(int imageWidth, int viewWidth) {
  Matrix scaleMatrix = new Matrix();
  float scale = (float) viewWidth / imageWidth;
  scaleMatrix.setScale(scale, scale);
  return scaleMatrix;
}

此方法返回一个比例 Matrix 来缩放图像,使其宽度与 ImageView 匹配并且它不考虑高度因素,因此部分缩放的 drawable 超出了 ImageView 的边界(在这种情况下drawable) 的下部将被裁剪。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ImageView iv = (ImageView) findViewById(R.id.iv);

    iv.getViewTreeObserver().addOnPreDrawListener(
       new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            int imageWidth = iv.getDrawable().getIntrinsicWidth();
            Matrix matrix = scaleWidthMatrix(imageWidth, iv.getWidth());
            //we should setScaleType to Matrix in order to use image matrix
            iv.setScaleType(ImageView.ScaleType.MATRIX);
            iv.setImageMatrix(matrix);
            //No need to call again so remove it
            iv.getViewTreeObserver().removeOnPreDrawListener(this);
            return true;
        }
    });

PS: OnPreDrawListener 在 onDraw 方法被调用之前被调用。此时,树中的所有视图都已测量,因此您可以将有效参数传递给scaleWidthMatrix 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2014-06-29
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多