Java 使用新位图更新ImageView会重置矩阵

Java 使用新位图更新ImageView会重置矩阵,java,android,eclipse,bitmap,Java,Android,Eclipse,Bitmap,我试图在imageView中自由转换位图 我有带矩阵的ImageView缩放类型和宽度与高度匹配\u父项 这是我的触摸监听代码 以下是我的触摸代码 public class Touch implements OnTouchListener { // These matrices will be used to move and zoom image public Matrix matrix = new Matrix(); Matrix savedMatrix = new

我试图在imageView中自由转换位图

我有带
矩阵的ImageView
缩放类型和宽度与高度
匹配\u父项

这是我的触摸监听代码

以下是我的触摸代码

public class Touch implements OnTouchListener 
{
    // These matrices will be used to move and zoom image
    public Matrix matrix = new Matrix();
    Matrix savedMatrix = new Matrix();

    // We can be in one of these 3 states
    static final int NONE = 0;
    static final int DRAG = 1;
    static final int ZOOM = 2;
    int mode = NONE;

    // Remember some things for zooming
    PointF start = new PointF();
    PointF mid = new PointF();
    float oldDist = 1f;

    float[] lastEvent = null;
    float d = 0f;
    float newRot = 0f;

    private float dx; // postTranslate X distance
    private float dy; // postTranslate Y distance
    private float[] matrixValues = new float[9];
    float matrixX = 0; // X coordinate of matrix inside the ImageView
    float matrixY = 0; // Y coordinate of matrix inside the ImageView
    float width = 0; // width of drawable
    float height = 0; // height of drawable

    View mainView; 
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        ImageView view = (ImageView) v;    

        switch (event.getAction() & MotionEvent.ACTION_MASK) 
        {
            case MotionEvent.ACTION_DOWN:
                savedMatrix.set(matrix);
                start.set(event.getX(), event.getY());
                mode = DRAG;
                lastEvent = null;
                break;

            case MotionEvent.ACTION_POINTER_DOWN:

                oldDist = spacing(event);
                if (oldDist > 10f) 
                {
                    //savedMatrix.set(matrix);
                    //midPoint(mid, event);
                    //mode = ZOOM;
                }

            break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                lastEvent = null;
                break;
            case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) 
            {
                matrix.set(savedMatrix);

                matrix.getValues(matrixValues);
                matrixX = matrixValues[2];
                matrixY = matrixValues[5];
                width = matrixValues[0] * (((ImageView) view).getDrawable()
                                        .getIntrinsicWidth());
                height = matrixValues[4] * (((ImageView) view).getDrawable()
                                        .getIntrinsicHeight());

                dx = event.getX() - start.x;
                dy = event.getY() - start.y;

                //if image will go outside left bound
                if (matrixX + dx < 0){
                    dx = -matrixX;
                }
                //if image will go outside right bound
                if(matrixX + dx + width > view.getWidth()){
                    dx = view.getWidth() - matrixX - width;
                }
                //if image will go oustside top bound
                if (matrixY + dy < 0){
                    dy = -matrixY;
                }
                //if image will go outside bottom bound
                if(matrixY + dy + height > view.getHeight()){
                    dy = view.getHeight() - matrixY - height;
                }
                matrix.postTranslate(dx, dy);   
            } 

            break;
        }

        view.setImageMatrix(matrix);
        return true; // indicate event was handled
    }

    public void updateValues(ImageView view)
    {
        matrix = view.getImageMatrix();
        matrix.postTranslate(dx, dy);  
        view.setImageMatrix(matrix);
    }

    /** Determine the space between the first two fingers */
    @SuppressLint("FloatMath")
    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return FloatMath.sqrt(x * x + y * y);
    }

}
public类Touch实现OnTouchListener
{
//这些矩阵将用于移动和缩放图像
公共矩阵=新矩阵();
矩阵savedMatrix=新矩阵();
//我们可能处于这三种状态之一
静态最终int NONE=0;
静态最终整数阻力=1;
静态最终整数缩放=2;
int模式=无;
//记住一些关于缩放的事情
PointF start=新的PointF();
PointF mid=新的PointF();
浮动oldDist=1f;
float[]lastEvent=null;
浮点数d=0f;
浮动newRot=0f;
私有浮点dx;//后平移X距离
私有浮点dy;//后平移Y距离
私有浮动[]矩阵值=新浮动[9];
float matrixX=0;//ImageView中矩阵的X坐标
float matrixY=0;//ImageView中矩阵的Y坐标
浮动宽度=0;//可拉伸的宽度
浮动高度=0;//可拉伸的高度
主视图;
@凌驾
公共布尔onTouch(视图v,运动事件)
{
ImageView视图=(ImageView)v;
开关(event.getAction()&MotionEvent.ACTION\u掩码)
{
case MotionEvent.ACTION\u DOWN:
savedMatrix.set(矩阵);
set(event.getX(),event.getY());
模式=拖动;
lastEvent=null;
打破
case MotionEvent.ACTION\u指针\u向下:
oldDist=间距(事件);
如果(旧区>10f)
{
//savedMatrix.set(矩阵);
//中点(中点,事件);
//模式=缩放;
}
打破
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:
模式=无;
lastEvent=null;
打破
case MotionEvent.ACTION\u移动:
如果(模式==拖动)
{
矩阵集(savedMatrix);
矩阵。获取值(矩阵值);
matrixX=matrixValues[2];
矩阵x=矩阵x值[5];
宽度=矩阵值[0]*((ImageView)视图).getDrawable()
.getIntrinsicWidth());
高度=矩阵值[4]*((图像视图)视图).getDrawable()
.getIntrinsicHeight());
dx=event.getX()-start.x;
dy=event.getY()-start.y;
//如果图像将超出左边界
if(matrixX+dx<0){
dx=-matrixX;
}
//如果图像将超出右边界
if(matrixX+dx+width>view.getWidth()){
dx=view.getWidth()-matrixX-width;
}
//如果图像将超出顶部边界
if(矩阵y+dy<0){
dy=-矩阵;
}
//如果图像将超出底部边界
if(矩阵y+dy+height>view.getHeight()){
dy=view.getHeight()-matrixY-height;
}
矩阵后翻译(dx,dy);
} 
打破
}
视图.setImageMatrix(矩阵);
返回true;//指示事件已处理
}
public void updateValue(图像视图)
{
矩阵=view.getImageMatrix();
矩阵后翻译(dx,dy);
视图.setImageMatrix(矩阵);
}
/**确定前两个手指之间的间距*/
@SuppressLint(“FloatMath”)
专用浮动间距(MotionEvent事件){
float x=event.getX(0)-event.getX(1);
float y=event.getY(0)-event.getY(1);
返回FloatMath.sqrt(x*x+y*y);
}
}
它工作得很好,但是当我尝试附加另一个位图时,它会丢失其当前位置,并且位图会移动到其原始的0,0状态。但是,在设置位图后,如果调用UpdateValue(ImageView视图),它将保留其当前拖动位置。但当我再次尝试拖动时,它突然变为0,0

我怎样才能解决这个问题。我希望新位图的起始位置与以前相同


另外,如何将图像设置为首先显示在中间位置,当前它显示在左上角

vTranslate.x = (getWidth()/2) - (scale * (sWidth()/2));
vTranslate.y = (getHeight()/2) - (scale * (sHeight()/2));

setImageResource不会更改矩阵,我没有检查setImageBitmap和setImageDrawable,但它的工作方式应该与我设置setImageBitmap的方式完全相同@pskink你也可以检查我的第二个问题吗?如果你想让它居中,只需相应地设置矩阵,你可以使用SetRectRect