通过倒置矩阵移动位图,位图移动后消失
Posted
技术标签:
【中文标题】通过倒置矩阵移动位图,位图移动后消失【英文标题】:Move bitmap via inverted Matrix, Bitmap disappears after movement 【发布时间】:2014-05-12 17:10:43 【问题描述】:我想在缩放的自定义图像视图中在 android 的画布上移动和缩放位图。 这适用于覆盖 onTouchEvent 的 getImageMatrix().invert(invertMatrix):
@Override
public boolean onTouchEvent(MotionEvent event)
if (!isStringEmpty(getTextForCanvas()))
dumpEvent(event);
eventX = event.getX();
eventY = event.getY();
eventXY = new float[] eventX, eventY;
getImageMatrix().invert(invertMatrix);
invertMatrix.mapPoints(eventXY);
switch (event.getAction() & MotionEvent.ACTION_MASK)
case MotionEvent.ACTION_DOWN:
savedMatrix.set(invertMatrix);
//start.set(event.getRawX(), event.getRawY());
start.set(eventX, eventY);
mode = Constants.DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f)
savedMatrix.set(invertMatrix);
midPoint(mid, event);
mode = Constants.ZOOM;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = Constants.NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == Constants.DRAG)
invertMatrix.set(savedMatrix);
invertMatrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
else if (mode == Constants.ZOOM)
float newDist = spacing(event);
if (newDist > 10f)
invertMatrix.set(savedMatrix);
scale = newDist / oldDist;
invertMatrix.postScale(scale, scale, mid.x, mid.y);
break;
setImageMatrix(invertMatrix);
return true;
onDraw 方法:
@Override
protected void onDraw(Canvas canvas)
super.onDraw(canvas);
canvas.drawBitmap(mImageBitmap, 0, 0, mImagePaint);
canvas.drawBitmap(canvasBitmap, invertMatrix, null);
但是最后一个 invertMatrix 丢失了数据,所以至少位图是在开始时绘制的(Android 4.4)或者消失了(Android 4.2)。 这里是 invertMatrix 的日志:
I/System.out﹕ Matrix[1.0, 0.0, 421.0][0.0, 1.0, 650.47687][0.0, 0.0, 1.0]
I/System.out﹕ Matrix[1.0, 0.0, 421.0][0.0, 1.0, 652.96216][0.0, 0.0, 1.0]
I/System.out﹕ Matrix[1.0, 0.0, 421.0][0.0, 1.0, 654.5][0.0, 0.0, 1.0]
I/System.out﹕ Matrix[1.0, 0.0, 421.0][0.0, 1.0, 656.0872][0.0, 0.0, 1.0]
I/System.out﹕ Matrix[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]
谁能帮助我?也许我必须存储矩阵以防失效?怎么样?
更新:登录 Android 4.2:(矩阵坐标反转):
I/System.out﹕ Matrix[1.0, -0.0, 101.778534][-0.0, 1.0, 225.0][0.0, 0.0, 1.0]
I/System.out﹕ Matrix[1.0, 0.0, -101.778534][0.0, 1.0, -225.0][0.0, 0.0, 1.0]
【问题讨论】:
你想实现什么? 你可能会在这里看到我的答案***.com/questions/21633545/… 感谢您的回答。我不想实现任何想法。我只想保留矩阵。正如您在日志中看到的,逆矩阵最后丢失了它的数据。同时我不知道为什么。也许这个问题类似于***.com/questions/20431374/…,但我的应用程序在 4.2 和 4.4 上都无法运行。 如果您想移动/缩放/旋转位图,请在此处查看我的答案:***.com/questions/21633545/… 用矩阵移动/缩放/旋转位图不是问题。问题是矩阵最后会丢失数据。 【参考方案1】:解决方案:
if (firstTime)
eventXY = new float[] eventX, eventY;
getImageMatrix().invert(invertMatrix);
invertMatrix.mapPoints(eventXY);
firstTime = false;
【讨论】:
以上是关于通过倒置矩阵移动位图,位图移动后消失的主要内容,如果未能解决你的问题,请参考以下文章