在編寫MusicPlayer的過程當中,播放歌曲時搜索歌手的圖片,並動態地將圖片設爲當前Activity的背景。當圖片大小與屏幕不適應時會致使圖片被拉神效果很很差看。好比你的手機分辨率是320X480,而圖片的分辨率是320X320,那麼,該圖片將被拉長。html
Returns an immutable bitmap from subset of the source bitmap, transformed by the optional matrix. The new bitmap may be the same object as source, or a copy may have been made. It is initialized with the same density as the original bitmap. If the source bitmap is immutable and the requested subset is the same as the source bitmap itself, then the source bitmap is returned and no new bitmap is created.java
source | The bitmap we are subsetting |
---|---|
x | The x coordinate of the first pixel in source |
y | The y coordinate of the first pixel in source |
width | The number of pixels in each row |
height | The number of rows |
m | Optional matrix to be applied to the pixels |
filter | true if the source should be filtered. Only applies if the matrix contains more than just translation. |
IllegalArgumentException | if the x, y, width, height values are outside of the dimensions of the source bitmap. |
---|
@SuppressWarnings("deprecation")
private void setDrawable(Bitmap backGroundMap, RelativeLayout lrcBackGround) {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;//獲取屏幕的寬和高
Log.v("franco-width", "width = " + width);
Log.v("franco-height", "height = " + height);//320X480
int widthDrawable = backGroundMap.getWidth();
int heightDrawable = backGroundMap.getHeight();//獲取背景圖片的寬和高
Log.v("franco-widthDrawable", "widthDrawable = " + widthDrawable);
Log.v("franco-heightDrawable", "heightDrawable = " + heightDrawable);//320X320
float scaleWidth = (float)width/widthDrawable;
float scaleHeight = (float)height/heightDrawable;//寬高比
Log.v("franco", "scaleWidth = " + scaleWidth);
Log.v("franco", "scaleHeight = " + scaleHeight);//1.0:1.5
Bitmap resizeBmp;
Matrix matrix = new Matrix();
if(scaleWidth < scaleHeight) { float scale = scaleHeight;//取大的 matrix.postScale(scale, scale);//縮放比例 int xStart = (int)(widthDrawable-widthDrawable/scale)/2; Log.v("franco-xStart", "xStart = " + xStart); /* * Bitmap source:要從中截圖的原始位圖 * int x:起始x座標 * int y:起始y座標 * int width:要截的圖的寬度 * int height:要截的圖的寬度 * x+width must be <= bitmap.width()否則會報錯 * 原理是先截圖再縮放,而不是先縮放再截圖!! */ resizeBmp = Bitmap.createBitmap(backGroundMap, xStart, 0, (int)(widthDrawable/scale), heightDrawable, matrix, true); } else { float scale = scaleWidth; matrix.postScale(scale, scale); int yStart = (int)(scaleHeight-scaleHeight/scale)/2; Log.v("franco-yStart", "yStart = " + yStart); resizeBmp = Bitmap.createBitmap(backGroundMap, 0, yStart, widthDrawable, (int)(heightDrawable/scale), matrix, true); } //Bitmap 轉化爲 Drawable BitmapDrawable drawable = new BitmapDrawable(getResources(), resizeBmp); //drawable.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT); lrcBackGround.setBackgroundDrawable(drawable); lrcBackGround.getBackground().setAlpha(150);//將背景該圖片透明度設低,避免歌詞顯示效果很差,數值越大透明度越高 }android