通过倒置矩阵移动位图,位图移动后消失

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;
        

【讨论】:

以上是关于通过倒置矩阵移动位图,位图移动后消失的主要内容,如果未能解决你的问题,请参考以下文章

Win32 - 如何获取给定系统光标位图的偏移量?

当其中的移动位图靠近屏幕的右边框时,android会翻译画布坐标?

Android中矩阵旋转后的拉伸位图

像拖放一样使用鼠标移动位图图像

如何使用java在android移动设备中获取位图uri

我们如何将位图图像存储到移动内存中?