HenCoder Android 開(kāi)發(fā)進(jìn)階:自定義 View 1-4 Canvas 對(duì)繪制的輔助
范圍裁切
clipRect()
canvas.save();
canvas.clipRect(left, top, right, bottom);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
clipPath()
canvas.save();
canvas.clipPath(path1);
canvas.drawBitmap(bitmap, point1.x, point1.y, paint);
canvas.restore();
幾何變換
使用 Canvas 來(lái)做常見(jiàn)的二維變換搪泳;
使用 Matrix 來(lái)做常見(jiàn)和不常見(jiàn)的二維變換稀轨;
使用 Camera 來(lái)做三維變換。
使用 Canvas 來(lái)做常見(jiàn)的二維變換
Canvas.translate(float dx, float dy) 平移
canvas.save();
canvas.translate(200, 0);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
Canvas.rotate(float degrees, float px, float py) 旋轉(zhuǎn)
canvas.save();
canvas.rotate(45, centerX, centerY);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
Canvas.scale(float sx, float sy, float px, float py) 放縮
canvas.save();
canvas.scale(1.3f, 1.3f, x + bitmapWidth / 2, y + bitmapHeight / 2);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
skew(float sx, float sy) 錯(cuò)切
canvas.save();
canvas.skew(0, 0.5f);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
使用 Matrix 來(lái)做變換
使用 Matrix 來(lái)做常見(jiàn)變換
matrix.reset();
matrix.postTranslate();
matrix.postRotate();
canvas.save();
canvas.concat(matrix);
canvas.drawBitmap(bitmap, x, y, paint);
canvas.restore();
使用 Matrix 來(lái)做自定義變換
Matrix 的自定義變換使用的是 setPolyToPoly() 方法森书。
Matrix.setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) 用點(diǎn)對(duì)點(diǎn)映射的方式設(shè)置變換
使用 Camera 來(lái)做三維變換
Camera 的三維變換有三類:旋轉(zhuǎn)靶端、平移谎势、移動(dòng)相機(jī)。
Camera.rotate*() 三維旋轉(zhuǎn)
rotateX(deg) rotateY(deg) rotateZ(deg) rotate(x, y, z)杨名。
camera.save(); // 保存 Camera 的狀態(tài)
camera.rotateX(30); // 旋轉(zhuǎn) Camera 的三維空間
canvas.translate(centerX, centerY); // 旋轉(zhuǎn)之后把投影移動(dòng)回來(lái)
camera.applyToCanvas(canvas); // 把旋轉(zhuǎn)投影到 Canvas
canvas.translate(-centerX, -centerY); // 旋轉(zhuǎn)之前把繪制內(nèi)容移動(dòng)到軸心(原點(diǎn))
camera.restore(); // 恢復(fù) Camera 的狀態(tài)
canvas.drawBitmap(bitmap, point1.x, point1.y, paint);
canvas.restore();
Camera.translate(float x, float y, float z) 移動(dòng)
Camera.setLocation(x, y, z) 設(shè)置虛擬相機(jī)的位置
在 Camera 中脏榆,相機(jī)的默認(rèn)位置是 (0, 0, -8)(英寸)。8 x 72 = 576台谍,所以它的默認(rèn)位置是 (0, 0, -576)(像素)须喂。
如果繪制的內(nèi)容過(guò)大,當(dāng)它翻轉(zhuǎn)起來(lái)的時(shí)候趁蕊,就有可能出現(xiàn)圖像投影過(guò)大的「糊臉」效果坞生。
camera.setLocation(0, 0, newZ);