imageview放大缩小以及滑动翻页

来源:互联网 发布:南苑机场 知乎 编辑:程序博客网 时间:2024/06/05 11:54

第一步:给imageview设置监听

imageView.setOnTouchListener(this);

第二步:实现监听方法

float oldDist = 1f;

public boolean onTouchEvent(MotionEvent event)
{


return hasMeasured;
// return gestureDetector.onTouchEvent(event);


}


@Override
public boolean onTouch(View v, MotionEvent event)
{


dumpEvent(event);


switch (event.getAction() & MotionEvent.ACTION_MASK)
{
// 手指压下屏幕
case MotionEvent.ACTION_DOWN:


matrix.set(imageView.getImageMatrix());
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());


mode = DRAG;
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:
if (mode == DRAG)
{
float dx = event.getX() - start.x;
float dy = event.getY() - start.y;
if (fanye == 1)
{
if (dx > 100)
{
if (dy < 300)
{
if (dy > -300)
{


if (currentPage == 1)
{
Toast.makeText(
Read_TeachingmaterialsActivity.this,
"已经是第一页了!", Toast.LENGTH_SHORT)
.show();
} else
{
String filepathString = path + bookName
+ "/" + currentPage + ".jpg";
File file = new File(filepathString);
if (file.exists())
{
currentPage--;
setCurrentPage();
String filepathString1 = path
+ bookName + "/" + currentPage
+ ".jpg";
imageView
.setImageBitmap(getBitmap2(filepathString1));
}
}
}
}
} else if (dx < -100)
{
if (dy < 300)
{
if (dy > -300)
{


if (currentPage == totalPage)
{
Toast.makeText(
Read_TeachingmaterialsActivity.this,
"已经是最后一页了!", Toast.LENGTH_SHORT)
.show();
} else
{
String filepathString = path + bookName
+ "/" + currentPage + ".jpg";
File file = new File(filepathString);
if (file.exists())
{
currentPage++;
setCurrentPage();


imageView
.setImageBitmap(getBitmap2(path
+ bookName + "/"
+ currentPage + ".jpg"));
}
}
}
}


}


}
}
// 手指在屏幕上移动,改事件会被不断触发
case MotionEvent.ACTION_MOVE:
// 拖动图片
if (mode == DRAG)
{


// 得到x轴的移动距离
float dx = event.getX() - start.x;
// 得到y轴的移动距离
float dy = event.getY() - start.y;
if (fanye == 0)
{
// matrix.set(savedMatrix);
// matrix.postTranslate(event.getX() - start.x,event.getY()
// - start.y); //xy方向都可以拖动
matrix.set(savedMatrix);
float[] values = new float[9];
matrix.getValues(values);
dx = checkDxBound(values, dx);
dy = checkDyBound(values, dy);
matrix.postTranslate(dx, dy);
}
// 缩放
} else if (mode == ZOOM)
{
float[] values = new float[9];
matrix.getValues(values);
float newDist = spacing(event);
if (imageViewHeight == imageViewHeight
* values[Matrix.MSCALE_X])
{
fanye = 1;
} else
{
fanye = 0;
}


if (newDist > 10f)
{


matrix.set(savedMatrix);
scale = newDist / oldDist;


matrix.postScale(scale, scale, mid.x, mid.y);


}
}


break;
case MotionEvent.ACTION_POINTER_UP:


mode = NONE;
break;
}


imageView.setImageMatrix(matrix);
CheckScale();
center();


return true;


};


private void dumpEvent(MotionEvent event)
{
String names[] =
{ "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN",
"POINTER_UP", "7?", "8?", "9?" };
StringBuilder sb = new StringBuilder();
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
sb.append("event ACTION_").append(names[actionCode]);
if (actionCode == MotionEvent.ACTION_POINTER_DOWN
|| actionCode == MotionEvent.ACTION_POINTER_UP)
{
sb.append("(pid ").append(
action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append(")");
}
sb.append("[");
for (int i = 0; i < event.getPointerCount(); i++)
{
sb.append("#").append(i);
sb.append("(pid ").append(event.getPointerId(i));
sb.append(")=").append((int) event.getX(i));
sb.append(",").append((int) event.getY(i));
if (i + 1 < event.getPointerCount())
sb.append(";");
}
sb.append("]");
// Log.d(TAG, sb.toString());
}


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);
}


private void midPoint(PointF point, MotionEvent event)
{
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}


/**
* 和当前矩阵对比,检验dy,使图像移动后不会超出ImageView边界

* @param values
* @param dy
* @return
*/
private float checkDyBound(float[] values, float dy)
{


float height1 = imageViewHeight;
if (height1 * values[Matrix.MSCALE_Y] < height1)
return 0;
if (values[Matrix.MTRANS_Y] + dy > 0)
dy = -values[Matrix.MTRANS_Y];
else if (values[Matrix.MTRANS_Y] + dy < -(height1
* values[Matrix.MSCALE_Y] - height1))
dy = -(height1 * values[Matrix.MSCALE_Y] - height1)
- values[Matrix.MTRANS_Y];
return dy;
}


/**
* 和当前矩阵对比,检验dx,使图像移动后不会超出ImageView边界

* @param values
* @param dx
* @return
*/
private float checkDxBound(float[] values, float dx)
{


float width1 = imageViewWidth;
if (width1 * values[Matrix.MSCALE_X] < width1)
{
fanye = 1;
return 0;
}


if (values[Matrix.MTRANS_X] + dx > 0)
dx = -values[Matrix.MTRANS_X];
else if (values[Matrix.MTRANS_X] + dx < -(width1
* values[Matrix.MSCALE_X] - width1))
dx = -(width1 * values[Matrix.MSCALE_X] - width1)
- values[Matrix.MTRANS_X];
return dx;
}


protected void center()
{
center(true, true);
}


private void center(boolean horizontal, boolean vertical)
{
if (bitmap == null)
{
return;
}
Matrix m = new Matrix();
m.set(matrix);
RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
m.mapRect(rect);
float height = rect.height();
float width = rect.width();
float deltaX = 0, deltaY = 0;
if (vertical)
{
// int screenHeight = dm.heightPixels; //手机屏幕分辨率的高度
float screenHeight = 400;
if (height < screenHeight)
{
deltaY = (screenHeight - height) / 2 - rect.top;
} else if (rect.top > 0)
{
deltaY = -rect.top;
} else if (rect.bottom < screenHeight)
{
deltaY = imageView.getHeight() - rect.bottom;
}
}


if (horizontal)
{
// int screenWidth = dm.widthPixels; //手机屏幕分辨率的宽度
float screenWidth = 400;
if (width < screenWidth)
{
deltaX = (screenWidth - width) / 2 - rect.left;
} else if (rect.left > 0)
{
deltaX = -rect.left;
} else if (rect.right < screenWidth)
{
deltaX = screenWidth - rect.right;
}
}
matrix.postTranslate(deltaX, deltaY);
}


// 限制最大最小缩放比例
protected void CheckScale()
{
float p[] = new float[9];
matrix.getValues(p);
if (mode == ZOOM)
{
if (p[0] < mMinScale)
{
matrix.setScale(mMinScale, mMinScale);
}
if (p[0] > mMaxScale)
{
matrix.set(savedMatrix);
}
}
}

0 0