Android中圖片適配螢幕問題,
近日在學習美化android應用的介面,在做APP啟動畫面時遇到這種情況:自己很喜歡的一張圖跟手機螢幕解析度不統一!!多麼痛苦的一件事!於是網上各種搜尋,有很多種方法,基本都試過,效果都不太好,下面說說網上很多人的回答。
其中一種方法就是在layout中加上setScaleType,可以設定幾個值,下面分別說明:
1、ImageView.ScaleType.CENTER。按照圖片本身的大小在View中置中顯示,如果圖片本身大於螢幕尺寸的話,則截取中間部分顯示。
2、ImageView.ScaleType.CENTER_CROP。按比例擴大,仍然是置中顯示,使得圖片的寬或高大於或等於View的邊長。
3、ImageView.ScaleType.CENTER_INSIDE。按比例縮小,效果與上面一點相反。
4、ImageView.ScaleType.FIT_CENTER。把圖片按比例擴大/縮小到View的寬度,置中顯示。
5、FIT_START, FIT_END在圖片縮放效果上與FIT_CENTER一樣,但是顯示的位置不同,FIT_START是置於頂部,FIT_CENTER置中,FIT_END置於底部。
6、 FIT_XY。不按比例縮放圖片,目標是把圖片塞滿整個View。此方法可使圖片全螢幕顯示。
但是!!!以上方法會剪下圖片或者直接變形,所以最終效果是非常差的。下面是:
然後我找到一個博主寫的方法,在使圖片填滿螢幕的前提下,最大程度保證圖片的縮放效果,保證圖片不變形。下面貼上代碼:
private void setBsetBitmap(Bitmap bitmap, ImageView imageView, int width,
int height) {
//計算最佳縮放倍數
// float scaleX = (float) width / bitmap.getWidth();
// float scaleY = (float) height / bitmap.getHeight();
// float bestScale = scaleX < scaleY ? scaleX : scaleY;
//計算最佳縮放倍數,以填充寬高為目標
float scaleX = (float) width / bitmap.getWidth();
float scaleY = (float) height / bitmap.getHeight();
float bestScale = scaleX > scaleY ? scaleX : scaleY;
//以填充高度的前提下,計算最佳縮放倍數
// float bestScale = (float) height / bitmap.getHeight();
float subX = (width - bitmap.getWidth() * bestScale) / 2;
float subY = (height - bitmap.getHeight() * bestScale) / 2;
Matrix imgMatrix = new Matrix();
imageView.setScaleType(ScaleType.MATRIX);
//縮放最佳大小
imgMatrix.postScale(bestScale, bestScale);
//移動到置中位置顯示
imgMatrix.postTranslate(subX, subY);
//設定矩陣
imageView.setImageMatrix(imgMatrix);
imageView.setImageBitmap(bitmap);
}
參數:bitmap:即所要顯示的圖片;imageView:顯示圖片的控制項;width:螢幕的寬度;height:螢幕高度。螢幕的寬高可用如下方法擷取:
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
screenWidth = display.getWidth();
screenHeight = display.getHeight();
在要顯示圖片的介面中調用此方法可使圖片不變形貼合螢幕,當然這樣做跟用適合螢幕解析度的圖片顯示還是有差別的,畢竟不是原圖,經過一定比例的調整,但是在這幾種方法中,這個方法的效果是最好的。下面是:
雖然圖片被截掉了一部分但是整體看起來好看很多了,因為這張圖片尺寸比手機高太多,所以差別會大一點,如果只是尺寸跟手機螢幕差別不大的話與原圖差別是非常細微的。
還有一種方法是在layout中設定保持寬高比,setadjustViewBounds(也可在代碼中完成),需要注意的是這個方法需要設定maxHeight和maxWidth,同時設定layout_height和layout_width為wrap_content,也可達到同樣效果,但是用這個方法在不同尺寸的手機上仍舊會有不同效果,所以還是寫一個setBsetBitmap方法比較好用,當然了,如果你有適配螢幕的圖片就不用那麼麻煩了。
新人第一次寫博,也剛學習安卓不長時間,有什麼錯誤各位大蝦請指正!
參考文章:http://blog.csdn.net/larryl2003/article/details/6919513
http://www.apkbus.com/android-178800-1-1.html