位圖是咱們開發中最經常使用的資源,畢竟一個漂亮的界面對用戶是最有吸引力的。css
可使用BitmapDrawable或者BitmapFactory來獲取資源中的位圖。 html
固然,首先須要獲取資源: java
Resources res=getResources(); android
使用BitmapDrawable獲取位圖 編程
// 讀取InputStream並獲得位圖 InputStream is=res.openRawResource(R.drawable.pic180); BitmapDrawable bmpDraw=new BitmapDrawable(is); Bitmap bmp=bmpDraw.getBitmap();
或者採用下面的方式:canvas
BitmapDrawable bmpDraw=(BitmapDrawable)res.getDrawable(R.drawable.pic180); Bitmap bmp=bmpDraw.getBitmap();
使用BitmapFactory獲取位圖app
(Creates Bitmap objects from various sources, including files, streams, and byte-arrays.) ide
使用BitmapFactory類decodeStream(InputStream is)解碼位圖資源,獲取位圖。函數
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);post
BitmapFactory的全部函數都是static,這個輔助類能夠經過資源ID、路徑、文件、數據流等方式來獲取位圖。
以上方法在編程的時候能夠自由選擇,在Android SDK中說明能夠支持的圖片格式以下:png (preferred), jpg (acceptable), gif (discouraged),和bmp(Android SDK Support Media Format)。
要獲取位圖信息,好比位圖大小、像素、density、透明度、顏色格式等,獲取獲得Bitmap就迎刃而解了,這些信息在Bitmap的手冊中,這裏只是輔助說明如下2點:
顯示位圖可使用核心類Canvas,經過Canvas類的drawBirmap()顯示位圖,或者藉助於BitmapDrawable來將Bitmap繪製到Canvas。固然,也能夠經過BitmapDrawable將位圖顯示到View中。
轉換爲BitmapDrawable對象顯示位圖
// 獲取位圖
Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic180);
// 轉換爲BitmapDrawable對象
BitmapDrawable bmpDraw=new BitmapDrawable(bmp);
// 顯示位圖
ImageView iv2 = (ImageView)findViewById(R.id.ImageView02);
iv2.setImageDrawable(bmpDraw);
使用Canvas類顯示位圖
這兒採用一個繼承自View的子類Panel,在子類的OnDraw中顯示
public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new Panel(this)); } class Panel extends View{ public Panel(Context context) { super(context); } public void onDraw(Canvas canvas){ Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); canvas.drawColor(Color.BLACK); canvas.drawBitmap(bmp, 10, 10, null); } } }
(1)將一個位圖按照需求重畫一遍,畫後的位圖就是咱們須要的了,與位圖的顯示幾乎同樣:drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)。
(2)在原有位圖的基礎上,縮放原位圖,建立一個新的位圖:CreateBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
(3)藉助Canvas的scale(float sx, float sy) (Preconcat the current matrix with the specified scale.),不過要注意此時整個畫布都縮放了。
(4)藉助Matrix:
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); Matrix matrix=new Matrix(); matrix.postScale(0.2f, 0.2f); Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(), bmp.getHeight(),matrix,true); canvas.drawColor(Color.BLACK); canvas.drawBitmap(dstbmp, 10, 10, null);
一樣,位圖的旋轉也能夠藉助Matrix或者Canvas來實現。
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pic180); Matrix matrix=new Matrix(); matrix.postScale(0.8f, 0.8f); matrix.postRotate(45); Bitmap dstbmp=Bitmap.createBitmap(bmp,0,0,bmp.getWidth(), bmp.getHeight(),matrix,true); canvas.drawColor(Color.BLACK); canvas.drawBitmap(dstbmp, 10, 10, null);
旋轉效果:
生成水印的過程。其實分爲三個環節:第一,載入原始圖片;第二,載入水印圖片;第三,保存新的圖片。
onDraw方法會傳入一個Canvas對象,它是你用來繪製控件視覺界面的畫布。
在onDraw方法裏,咱們常常會看到調用save和restore方法,它們究竟是幹什麼用的呢?
❑ save:用來保存Canvas的狀態。save以後,能夠調用Canvas的平移、放縮、旋轉、錯切、裁剪等操做。
❑ restore:用來恢復Canvas以前保存的狀態。防止save後對Canvas執行的操做對後續的繪製有影響。
save和restore要配對使用(restore能夠比save少,但不能多),若是restore調用次數比save多,會引起Error。save和restore之間,每每夾雜的是對Canvas的特殊操做。
例如:咱們先想在畫布上繪製一個右向的三角箭頭,固然,咱們能夠直接繪製,另外,咱們也能夠先把畫布旋轉90°,畫一個向上的箭頭,而後再旋轉回來(這種旋轉操做對於畫圓周上的標記很是有用)。而後,咱們想在右下角有個20像素的圓,那麼,onDraw中的核心代碼是:
int px = getMeasuredWidth();
int py = getMeasuredWidth();
// Draw background
canvas.drawRect(0, 0, px, py, backgroundPaint);
canvas.save();
canvas.rotate(90, px/2, py/2);
// Draw up arrow
canvas.drawLine(px / 2, 0, 0, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px, py / 2, linePaint);
canvas.drawLine(px / 2, 0, px / 2, py, linePaint);
canvas.restore();
// Draw circle
canvas.drawCircle(px - 10, py - 10, 10, linePaint);
效果如圖1所示:
若是咱們不調用save和restore會是什麼樣子呢?如圖2所示:
從這兩個圖中,咱們就能看到圓圈位置的明顯差別。不進行Canvas的save和restore操做的話,全部的圖像都是在畫布旋轉90°後的畫布上繪製的。當執行完onDraw方法,系統自動將畫布恢復回來。save和restore操做執行的時機不一樣,就能形成繪製的圖形不一樣。
本文參考: Android SDK
moandroid.com
http://www.cnblogs.com/xirihanlin/archive/2009/07/24/1530246.html