Android canvas drawBitmap方法詳解及實(shí)例
Android canvas drawBitmap方法詳解及實(shí)例
之前自己在自定義view,用到canvas.drawBitmap(Bitmap, SrcRect, DesRect, Paint)的時(shí)候,對(duì)其中的第2和3個(gè)參數(shù)的含義含糊不清。看源碼函數(shù)也沒(méi)理解,然后看了一些其他的博客加上自己的理解,整理如下。首先,我們看一張圖片,今天就要繪制這張圖片。
然后將圖片用紅色的線條分成4個(gè)部分,如下:
我們自定義一個(gè)View,代碼如下:
public class PoterDuffLoadingView extends View { private Resources mResources; private Paint mBitPaint; private Bitmap mBitmap; private int mTotalWidth, mTotalHeight; private Bitmap girlBitmap; private int girlBitWidth , girlBitHeight; private Rect girlSrcRect , girlDesRect; public PoterDuffLoadingView(Context context) { super(context); mResources = getResources(); initBitmap(); } private void initBitmap() { //美女圖片的寬和高 girlBitmap = ((BitmapDrawable)mResources.getDrawable(R.drawable.a1)).getBitmap(); girlBitWidth = girlBitmap.getWidth(); girlBitHeight = girlBitmap.getHeight(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(girlBitmap, girlSrcRect, girlDesRect, null); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { Log.d("xxxxxx", "onSizeChanged , w = "+w+" , h = "+h+" , mBitWidth = "+mBitWidth+" , mBitHeight = "+mBitHeight); super.onSizeChanged(w, h, oldw, oldh); mTotalWidth = w; mTotalHeight = h; girlSrcRect = new Rect(0, 0, girlBitWidth, girlBitHeight); girlDesRect = new Rect(0, 0, girlBitWidth, girlBitHeight); } }
其中:
girlSrcRect = new Rect(0, 0, girlBitWidth, girlBitHeight);
表示要畫的圖就是整個(gè)圖片的大小。我覺(jué)得girlSrcRect 就是指畫圖的大小范圍。
girlDesRect :就是所畫的圖在View上的位置。表是距離左邊和上邊為0,右邊(girlBitWidth - 0)就為圖片的寬度,下邊(girlBitHeight - 0)為圖片的高度。
效果圖如下 :
當(dāng)我們想移動(dòng)圖片的位置,代碼如下:
girlDesRect = new Rect(20, 50, 20+girlBitWidth, 50+girlBitHeight);
表示圖片的左邊所在的位置為20個(gè)像素,圖片的頂部在View上的位置為50個(gè)像素。圖片右邊在view上的位置為(20+girlBitWidth )即距離圖片的左邊的距離是:[(20+girlBitWidth )- 20]。底部一樣的道理。
如圖:
如果我們只想畫上述圖片的第2部分,該怎么做呢?我們只需要做如下修改:
girlSrcRect = new Rect(girlBitWidth/2, 0, girlBitWidth, girlBitHeight/2); girlDesRect = new Rect(20, 50, 20+girlBitWidth, 50+girlBitHeight);
效果圖:
是不是就是顯示圖片的第二部分呢,細(xì)心的會(huì)發(fā)現(xiàn)這個(gè)圖和之前整體的圖片大小是一樣的。原因是什么呢:
girlSrcRect :表示我們要畫圖的部分。
girlDesRect :表示我們要繪圖的位置。從上面的girlDesRect 值看出,繪圖的位置的確是整個(gè)圖片的位置。
那我們只想要1/4圖的大小呢,怎么辦?
girlSrcRect = new Rect(girlBitWidth/2, 0, girlBitWidth, girlBitHeight/2); girlDesRect = new Rect(20, 50, 20+girlBitWidth/2, 50+girlBitHeight/2);
如下圖:
好了,就到這里了,畢竟自己寫的才回更深刻!
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Android開發(fā)實(shí)現(xiàn)的文本折疊點(diǎn)擊展開功能示例
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的文本折疊點(diǎn)擊展開功能,涉及Android界面布局與屬性控制相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Android編程實(shí)現(xiàn)泡泡聊天界面實(shí)例詳解(附源碼)
這篇文章主要介紹了Android編程實(shí)現(xiàn)泡泡聊天界面,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android泡泡聊天界面的窗體定義與功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Android延遲實(shí)現(xiàn)的幾種解決方法及原理分析
這篇文章主要給大家介紹了關(guān)于Android延遲實(shí)現(xiàn)的幾種解決方法以及其中的原理分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Android手勢(shì)密碼實(shí)現(xiàn)實(shí)例代碼
本篇文章主要介紹了Android手勢(shì)密碼實(shí)現(xiàn)實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04android實(shí)用工具類分享(獲取內(nèi)存/檢查網(wǎng)絡(luò)/屏幕高度/手機(jī)分辨率)
這篇文章主要介紹了android實(shí)用工具類,包括獲取內(nèi)存、檢查網(wǎng)絡(luò)、屏幕高度、手機(jī)分辨率、獲取版本號(hào)等功能,需要的朋友可以參考下2014-03-03Android自定義控件實(shí)現(xiàn)隨手指移動(dòng)的小球
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)隨手指移動(dòng)的小球,隨著手指觸摸移動(dòng)而移動(dòng)的效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Android利用ShaderMask實(shí)現(xiàn)花里胡哨的文字特效
我們的?App?大部分時(shí)候的文字都是一種顏色,實(shí)際上,文字的顏色也可以多姿多彩。我們今天就來(lái)介紹一個(gè)能夠輕松實(shí)現(xiàn)文字漸變色的組件?——?ShaderMask,感興趣的可以了解一下2022-12-12