記錄一次android畫氣泡實現(xiàn), path和陰影的使用

如何畫氣泡:

https://github.com/smuyyh/BubblePopupWindow基礎(chǔ)上記性了改動.
動態(tài)計算了小三角形的位置.
當(dāng)彈框超過屏幕底部時, 動態(tài)調(diào)整了顯示位置和小三角形的位置.

具體步驟:
先要生成一個三角形小尾巴的path數(shù)據(jù):


image.png

如圖, 紅色圈住的部分, 實際是一個類似90度的三角形, 先創(chuàng)建這個三角形的path:


private void renderBubbleLegPrototype() {

mBubbleLegPrototype.moveTo(0, 0);

mBubbleLegPrototype.lineTo(x, -y);

mBubbleLegPrototype.lineTo(x, y);

mBubbleLegPrototype.close();

}

其實上面幾行代碼畫出來的是一個正好相反的三角形, 類似:

image.png

有了這個"三角形", 就可以進(jìn)行選中平移, 拼接到矩形上, 使其開起來像個小氣泡.

對于上面截圖中的氣泡, 需要先選中180度:

matrix.postRotate(180);

注意這里的選中時繞原點旋轉(zhuǎn)的, 所以還需要再調(diào)整橫向的位置.

matrix.postTranslate(dstX, dstY);

具體值, 需要根據(jù)矩形邊框的尺寸及陰影大小進(jìn)行調(diào)節(jié).

最后是在onDraw()中畫出整個形狀


mPath.rewind();

mPath.addRoundRect(new RectF(l,t,r,b), CORNER_RADIUS, CORNER_RADIUS, Direction.CW);

mPath.addPath(mBubbleLegPrototype, renderBubbleLegMatrix(width - PADDING-2, height));

canvas.drawPath(mPath, mPaint);

忽略其中的參數(shù)值, 只需要關(guān)注調(diào)用的這幾個方法.

顯示rewind()清空path值,

然后通過addRoundRect往path里添加了一個圓角矩形

然后通過addPath()把我們前面創(chuàng)建的三角形path及其需要的變換矩陣添加到整體path中.

最后通過drawPath把整個形狀path, 畫處理.

這是如何畫氣泡的簡單介紹. 再說下如何使畫出來的形狀帶有陰影.

陰影這個東西, 設(shè)計很喜歡, 而且往往都是喜歡四周帶陰影, 而不是android默認(rèn)的只在底部和右側(cè)帶陰影. 國內(nèi)的設(shè)計師都好像跟MD有仇一樣.

繼續(xù)說如何在畫出的形狀四周都加上陰影.

很簡單, 只需要在mpaint中添加陰影參數(shù):


if (Build.VERSION.SDK_INT >= 11) {

setLayerType(LAYER_TYPE_SOFTWARE, mFillPaint);

}

mPaint.setShadowLayer(SHADOW_LENGTH, 0, 0, SHADOW_COLOR);

需要注意這里中間兩個參數(shù)是0,0 如果是非0值, 那就會在底部和右側(cè)進(jìn)行傾斜.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容