2011-11-30 60 views

回答

2

在代码中(而不是通过布局XML),您可以通过在缩放位图后裁剪图像以创建足够大的剪裁来创建右宽高比(设备高x宽)的位图。您需要确保图像可以放大/缩小(最好是放下)而不会损失清晰度。您还需要确保在以不同宽高比裁剪图像时重要信息不会丢失。

一旦你得到了位图,然后将它作为ImageView的内容放置在显示器上。

我发现最好将底层图像与图层视图分开放置,以使文本保持清晰。

我创建了ImageView类的一个子类来封装调整大小和裁剪。唯一值的方法是重写onMeasure()方法:

/** 
* Override the onMeasure method to resize the Bitmap as needed 
*/ 
@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 


    Drawable currentDrawable = this.getDrawable(); 
    BitmapDrawable theBitmapDrawable; 
    if (BitmapDrawable.class.isInstance(currentDrawable)){ 
     // We have a bitmap to work with 
     theBitmapDrawable = (BitmapDrawable) currentDrawable; 
     Bitmap currentBitmap = theBitmapDrawable.getBitmap(); 
     Bitmap resizedBitmap = null; 

     if (currentBitmap != null) { 
      int currentHeight = currentBitmap.getHeight(); 
      int currentWidth = currentBitmap.getWidth(); 
      int parentWidth = MeasureSpec.getSize(widthMeasureSpec); 
      int parentHeight = MeasureSpec.getSize(heightMeasureSpec); 
      if ((currentHeight != parentHeight) || (currentWidth != parentWidth)) { 
       // The bitmap needs to be resized, and/or cropped to fit 
       if ((currentHeight < parentHeight) || (currentWidth < parentWidth)) { 
        // Need to make the bitmap larger 
        float heightFactor = (float) parentHeight/(float) currentHeight; 
        float widthFactor = (float) parentWidth/(float) currentWidth; 
        float scaleFactor; 
        // Choose the largest factor 
        if (Float.compare(heightFactor, widthFactor) < 0) { 
         scaleFactor = widthFactor; 
        } else { 
         scaleFactor = heightFactor; 
        } 
        int dstWidth = (int) (currentWidth * scaleFactor); 
        int dstHeight = (int) (currentHeight * scaleFactor); 
        if (dstWidth < parentWidth) dstWidth = parentWidth;  // Deal with off by one rounding errors 
        if (dstHeight < parentHeight) dstHeight = parentHeight; // Deal with off by one rounding errors 
        resizedBitmap = Bitmap.createScaledBitmap(currentBitmap, dstWidth, dstHeight, true); 
        currentBitmap.recycle(); 
       } else if ((currentHeight > parentHeight) && (currentWidth > parentWidth)){ 
        // Need to make the splash screen bitmap smaller 
        float heightFactor = (float) parentHeight/(float) currentHeight; 
        float widthFactor = (float) parentWidth/(float) currentWidth; 
        float scaleFactor; 
        // Choose the largest factor 
        if (Float.compare(heightFactor, widthFactor) < 0) { 
         scaleFactor = widthFactor; 
        } else { 
         scaleFactor = heightFactor; 
        } 
        int dstWidth = (int) (currentWidth * scaleFactor); 
        int dstHeight = (int) (currentHeight * scaleFactor); 
        if (dstWidth < parentWidth) dstWidth = parentWidth;  // Deal with off by one rounding errors 
        if (dstHeight < parentHeight) dstHeight = parentHeight; // Deal with off by one rounding errors 
        resizedBitmap = Bitmap.createScaledBitmap(currentBitmap, dstWidth, dstHeight, true); 
        currentBitmap.recycle(); 
       } else { 
        // No need to resize the image - we'll just need to crop it 
        resizedBitmap = currentBitmap; 
       } 

       // Now crop the image so that it fits the aspect ratio of the screen 
       currentHeight = resizedBitmap.getHeight(); 
       currentWidth = resizedBitmap.getWidth(); 
       Bitmap newBitmap; 
       if ((currentHeight != parentHeight) || (currentWidth != parentWidth)) { 
        // Crop the image to fit exactly 
        int startX = (currentWidth - parentWidth)/2; 
        if (startX < 0) startX = 0; // Hmm! 
        int startY = (currentHeight - parentHeight)/2; 
        if (startY < 0) startY = 0; // Hmm! again 
        newBitmap = Bitmap.createBitmap(resizedBitmap, startX, startY, parentWidth, parentHeight); 
        resizedBitmap.recycle(); 
       } else { 
        // The resized image is the exact right size 
        newBitmap = resizedBitmap; 
       } 

       this.setImageBitmap(newBitmap); 
      } 
     } 
    } 

} 
+0

谢谢,但我不能Override onMeasure方法。不知道为什么.. – user420574

+0

@ user420574 - 您需要扩展ImageView类,如'public class WidgetSelfSizingImageView extends ImageView {' – Colin