ImageView适合宽度裁剪​​底部

时间:2018-01-16 05:25:26

标签: android matrix imageview scaletype

我想缩放图像以适应屏幕宽度并保持宽高比

  1. 如果图像高度小于屏幕高度。我想要力量 它。
  2. 如果图像高度大于屏幕高度。我想裁剪它。
  3. 我google for it但是将scaleType设置为FitXY& AdjustViewInBounds不起作用。

    我使用50x50图像测试并且它无法正常工作

    enter image description here

    // Use createScaledBitmap will cause OOM, so I set image to imageView first.
    ImageView image= (ImageView) mPageView.findViewById(R.id.image);
    
    // Set image to get IntrinsicWidth & IntrinsicHeight
    image.setImageResource(imageDrawable);
    
    // Change scale type to matrix
    image.setScaleType(ImageView.ScaleType.MATRIX);
    
    // Calculate bottom crop matrix
    Matrix matrix = getBottomCropMatrix(mContext, image.getDrawable().getIntrinsicWidth(), image.getDrawable().getIntrinsicHeight());
    
    // Set matrixx
    image.setImageMatrix(matrix);
    // Redraw image
    image_image.invalidate();
    

    我的矩阵使用以下方法

    Matrix matrix = new Matrix();
    
    // Get screen size
    int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
    int screenHeight = context.getResources().getDisplayMetrics().heightPixels;
    
    // Get scale to match parent
    float scaleWidthRatio = screenWidth / imageWidth;
    float scaleHeightRatio = screenHeight / imageHeight;
    
    // screenHeight multi by width scale to get scaled image height
    float scaledImageHeight = imageHeight * scaleWidthRatio;
    
    // If scaledImageHeight < screenHeight, set scale to scaleHeightRatio to fit screen
    // If scaledImageHeight >= screenHeight, use width scale as height scale
    if (scaledImageHeight >= screenHeight) {
        scaleHeightRatio = scaleWidthRatio;
    }
    
    matrix.setScale(scaleWidthRatio, scaleHeightRatio);
    

    我不知道我错在哪里。它只是在底部留下一些空白。

    ======

    更新。我发现了问题。我的矩阵是正确的。底部的空白是软导航栏。使用以下方法将得到错误的值。

      

    getResources()。getDisplayMetrics()

    将其更改为

        DisplayMetrics displaymetrics = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getRealMetrics(displaymetrics);
        int screenWidth = displaymetrics.widthPixels;
        int screenHeight = displaymetrics.heightPixels;
    

    它有效!

2 个答案:

答案 0 :(得分:1)

更新。我发现了问题。我的矩阵是正确的。底部的空白是软导航栏。使用以下方法将得到错误的值。

  

getResources()。getDisplayMetrics()

将其更改为

    DisplayMetrics displaymetrics = new DisplayMetrics();
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    windowManager.getDefaultDisplay().getRealMetrics(displaymetrics);
    int screenWidth = displaymetrics.widthPixels;
    int screenHeight = displaymetrics.heightPixels;

它有效!

答案 1 :(得分:0)

试试这个,

使用android:scaleType centerCrop代替fitXYmatrix

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop" />