我目前正在研究一种多点裁剪工具,现在我已经卡住了几天。基本上,这就是这样的:
1)使用设备的相机拍摄大分辨率照片 2)使用自定义类(扩展ImageView)将结果位图放在屏幕上 3)在检测到的轮廓上绘制处理程序 - 这些稍后用于裁剪大位图。
我想在拖动角处理程序时实现圆形缩放,以便更好地从用户进行调整。这就是我到目前为止所做的:
@Override
public void setImageBitmap(Bitmap bm) {
originalBitmap = bm.copy(Bitmap.Config.ARGB_8888, true);
shaderPaint = new Paint();
shader = new BitmapShader(originalBitmap, TileMode.CLAMP, TileMode.CLAMP);
shaderPaint.setShader(shader);
shaderMatrix = new Matrix();
....
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
.......
if (zooming) {
shaderMatrix.reset();
inverseMatrix.reset();
if (getImageMatrix().invert(inverseMatrix)) {
float[] pts = new float[2];
pts[0] = currentMovedPoint.x;
pts[1] = currentMovedPoint.y;
inverseMatrix.mapPoints(pts);
shaderMatrix.postTranslate(-pts[0], -pts[1]);
shaderMatrix.postScale(2f, 2f);
shader.setLocalMatrix(shaderMatrix);
canvas.drawCircle(zoomCenterX, zoomCenterY, zoomRadius, shaderPaint);
canvas.drawLine(zoomCenterX - 20, zoomCenterY, zoomCenterX + 20, zoomCenterY, borderPaint);
canvas.drawLine(zoomCenterX, zoomCenterY - 20, zoomCenterX, zoomCenterY + 20, borderPaint);
}
}
zoomCenterX和zoomCenterY是画布上的固定点。问题是缩放视图不在currentMovedPoint坐标的中心(它完全由zoomCenterX,zoomCenterY偏移)。如果我将zoomCenterX和zoomCenterY设置为0,则缩放视图正确居中 - 但我不能使用它,因为屏幕上只显示四分之一的缩放圈。
我尝试通过zoomCenterX和zoomCenterY平移shaderMatrix但没有成功(缩放视图仍未居中在当前选定的点上)。
我是以错误的方式解决这个问题,还是我缺少一些东西?
答案 0 :(得分:0)
好的,所以发布问题让我再次检查我的算法。问题是我需要在将其添加到着色器之前对着色器矩阵应用另一个平移。
所以我补充道:
float[] centerPts = new float[2];
centerPts[0] = zoomCenterX;
centerPts[1] = zoomCenterY;
inverseMatrix.mapPoints(centerPts);
shaderMatrix.postTranslate(-centerPts[0], centerPts[1]);
后
shaderMatrix.postScale(2f, 2f);