Java 使用新位图更新ImageView会重置矩阵
我试图在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
缩放类型和宽度与高度匹配\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