2014-01-06 39 views
1

我是Android新手,来自IOS并遇到一个小问题。 我有一个很长的图像,因此在平板电脑上图像跨越整个屏幕而不缩放图像。Android图像缩放问题

但是,当我打开手机上的应用程序图像被压缩高度以适应屏幕。 我如何解决这个问题?

Problem

的图像被设定为在的LinearLayout背景:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@drawable/blur"/> 

我想:

android:scaleType="fitStart" 
android:scaleType="center" 
android:scaleType="fitcenter 

回答

3

的Android始终随背景,以适应其查看scaleType只适用于ImageViews,您需要执行一个ImageView,带有android:src引用您的图像。只有这样你才能开始玩android:scaleType

+0

使用imageview并尝试所有的比例类型。关闭的那个是矩阵标度类型。 – Msmit1993

0

尝试将XML文件转换到

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/blur"/> 

如果你的工作就完成了,然后它的好别人按你必须使用imageview @ernir。

0

LinearLayout没有android:scaleType属性定义。您应该使用ImageView并将资源设置为android:src。将其尺寸/位置扩大至LinearLayout。然后你可以使用的ImageView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent">  

    <ImageView 
     android:id="@+id/img" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:src="@drawable/blur" 
     android:scaleType="centerCrop" 
    /> 
</LinearLayout> 
1

android:scaleType="centerCrop"属性如果你想以适应或缩放图像到图像视图可以试试这个代码。

public class ScalingUtilities { 
    /** 
* Utility function for decoding an image resource. The decoded bitmap will 
* be optimized for further scaling to the requested destination dimensions 
* and scaling logic. 
* @param res The resources object containing the image data 
* @param resId The resource id of the image data 
* @param dstWidth Width of destination area 
* @param dstHeight Height of destination area 
* @param scalingLogic Logic to use to avoid image stretching 
* @return Decoded bitmap 
*/ 
public static Bitmap decodeResource(Resources res, int resId, int dstWidth, int dstHeight, 
     ScalingLogic scalingLogic) { 
    Options options = new Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 
    options.inJustDecodeBounds = false; 
    options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, dstWidth, 
      dstHeight, scalingLogic); 
    Bitmap unscaledBitmap = BitmapFactory.decodeResource(res, resId, options); 

    return unscaledBitmap; 
} 

/** 
* Utility function for creating a scaled version of an existing bitmap 
* 
* @param unscaledBitmap Bitmap to scale 
* @param dstWidth Wanted width of destination bitmap 
* @param dstHeight Wanted height of destination bitmap 
* @param scalingLogic Logic to use to avoid image stretching 
* @return New scaled bitmap object 
*/ 
public static Bitmap createScaledBitmap(Bitmap unscaledBitmap, int dstWidth, int dstHeight, 
     ScalingLogic scalingLogic) { 
    Rect srcRect = calculateSrcRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(), 
      dstWidth, dstHeight, scalingLogic); 
    Rect dstRect = calculateDstRect(unscaledBitmap.getWidth(), unscaledBitmap.getHeight(), 
      dstWidth, dstHeight, scalingLogic); 
    Bitmap scaledBitmap = Bitmap.createBitmap(dstRect.width(), dstRect.height(), 
      Config.ARGB_8888); 
    Canvas canvas = new Canvas(scaledBitmap); 
    canvas.drawBitmap(unscaledBitmap, srcRect, dstRect, new Paint(Paint.FILTER_BITMAP_FLAG)); 

    return scaledBitmap; 
} 

/** 
* ScalingLogic defines how scaling should be carried out if source and 
* destination image has different aspect ratio. 
* 
* CROP: Scales the image the minimum amount while making sure that at least 
* one of the two dimensions fit inside the requested destination area. 
* Parts of the source image will be cropped to realize this. 
* 
* FIT: Scales the image the minimum amount while making sure both 
* dimensions fit inside the requested destination area. The resulting 
* destination dimensions might be adjusted to a smaller size than 
* requested. 
*/ 
public static enum ScalingLogic { 
    CROP, FIT 
} 

/** 
* Calculate optimal down-sampling factor given the dimensions of a source 
* image, the dimensions of a destination area and a scaling logic. 
* 
* @param srcWidth Width of source image 
* @param srcHeight Height of source image 
* @param dstWidth Width of destination area 
* @param dstHeight Height of destination area 
* @param scalingLogic Logic to use to avoid image stretching 
* @return Optimal down scaling sample size for decoding 
*/ 
public static int calculateSampleSize(int srcWidth, int srcHeight, int dstWidth, int dstHeight, 
     ScalingLogic scalingLogic) { 
    if (scalingLogic == ScalingLogic.FIT) { 
     final float srcAspect = (float)srcWidth/(float)srcHeight; 
     final float dstAspect = (float)dstWidth/(float)dstHeight; 

     if (srcAspect > dstAspect) { 
      return srcWidth/dstWidth; 
     } else { 
      return srcHeight/dstHeight; 
     } 
    } else { 
     final float srcAspect = (float)srcWidth/(float)srcHeight; 
     final float dstAspect = (float)dstWidth/(float)dstHeight; 

     if (srcAspect > dstAspect) { 
      return srcHeight/dstHeight; 
     } else { 
      return srcWidth/dstWidth; 
     } 
    } 
} 

/** 
* Calculates source rectangle for scaling bitmap 
* 
* @param srcWidth Width of source image 
* @param srcHeight Height of source image 
* @param dstWidth Width of destination area 
* @param dstHeight Height of destination area 
* @param scalingLogic Logic to use to avoid image stretching 
* @return Optimal source rectangle 
*/ 
public static Rect calculateSrcRect(int srcWidth, int srcHeight, int dstWidth, int dstHeight, 
     ScalingLogic scalingLogic) { 
    if (scalingLogic == ScalingLogic.CROP) { 
     final float srcAspect = (float)srcWidth/(float)srcHeight; 
     final float dstAspect = (float)dstWidth/(float)dstHeight; 

     if (srcAspect > dstAspect) { 
      final int srcRectWidth = (int)(srcHeight * dstAspect); 
      final int srcRectLeft = (srcWidth - srcRectWidth)/2; 
      return new Rect(srcRectLeft, 0, srcRectLeft + srcRectWidth, srcHeight); 
     } else { 
      final int srcRectHeight = (int)(srcWidth/dstAspect); 
      final int scrRectTop = (int)(srcHeight - srcRectHeight)/2; 
      return new Rect(0, scrRectTop, srcWidth, scrRectTop + srcRectHeight); 
     } 
    } else { 
     return new Rect(0, 0, srcWidth, srcHeight); 
    } 
} 

/** 
* Calculates destination rectangle for scaling bitmap 
* 
* @param srcWidth Width of source image 
* @param srcHeight Height of source image 
* @param dstWidth Width of destination area 
* @param dstHeight Height of destination area 
* @param scalingLogic Logic to use to avoid image stretching 
* @return Optimal destination rectangle 
*/ 
public static Rect calculateDstRect(int srcWidth, int srcHeight, int dstWidth, int dstHeight, 
     ScalingLogic scalingLogic) { 
    if (scalingLogic == ScalingLogic.FIT) { 
     final float srcAspect = (float)srcWidth/(float)srcHeight; 
     final float dstAspect = (float)dstWidth/(float)dstHeight; 

     if (srcAspect > dstAspect) { 
      return new Rect(0, 0, dstWidth, (int)(dstWidth/srcAspect)); 
     } else { 
      return new Rect(0, 0, (int)(dstHeight * srcAspect), dstHeight); 
     } 
    } else { 
     return new Rect(0, 0, dstWidth, dstHeight); 
    } 
}}