实现 Android 的照片选择区域功能
主要有参考 pqpo/SmartCropper
1, 显示
显示四条边和八个点,
八个点: 4 个角和 4 条边的中点
/* 裁剪区域,
0, 左上 -> LeftTop,
1, 右上 -> RightTop,
2, 右下 -> RightBottom,
3, 左下 -> LeftBottom
*/
Point[] mCropPoints;
// 4 条边的中点
Point[] mEdgeMidPoints;
复制代码
绘制
protected void onDrawCropPoint(Canvas canvas) {
//绘制蒙版
onDrawMask(canvas);
//绘制辅助线
onDrawGuideLine(canvas);
//绘制选区线
onDrawLines(canvas);
//绘制锚点
onDrawPoints(canvas);
//绘制放大镜
// ...
}
复制代码
具体绘制部分:
绘制八个点
protected void onDrawPoints(Canvas canvas) {
if (!checkPoints(mCropPoints)) {
return;
}
// 绘制 4 个角
for (Point point : mCropPoints) {
canvas.drawCircle(getViewPointX(point), getViewPointY(point), dp2px(POINT_RADIUS), mPointFillPaint);
canvas.drawCircle(getViewPointX(point), getViewPointY(point), dp2px(POINT_RADIUS), mPointPaint);
}
if (mShowEdgeMidPoint) {
setEdgeMidPoints();
// 中间锚点
// 绘制 4 条边上的中点
for (Point point : mEdgeMidPoints){
canvas.drawCircle(getViewPointX(point), getViewPointY(point), dp2px(POINT_RADIUS), mPointFillPaint);
canvas.drawCircle(getViewPointX(point), getViewPointY(point), dp2px(POINT_RADIUS), mPointPaint);
}
}
}
复制代码
绘制 4 条边上的中点前,
先算出当前 4 条边上中点的位置
public void setEdgeMidPoints(){
// 中点不存在,就新建
if (mEdgeMidPoints == null){
mEdgeMidPoints = new Point[4];
for (int i = 0; i < mEdgeMidPoints.length; i++){
mEdgeMidPoints[i] =