触摸屏是根据缩放的图像不调整 [英] Touch screen is not adjusting according to zoomed image
本文介绍了触摸屏是根据缩放的图像不调整的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我做android系统中的图像注释和我加缩放功能进去。所以,现在当我缩放图像,之后做任何注解,它不是在这一点上,我感动,而不是其上做作为原始图像(未缩放图像)的屏幕。
的onDraw方法
@覆盖
保护无效的onDraw(帆布油画){
super.onDraw(画布);
onDrawReady = TRUE; imageRenderedAtLeastOnce = TRUE;
canvas.concat(矩阵); 对于(DrawObject D:路径){
如果(d.getType()== MODE_DRAWING){
canvas.drawPath(d.getPair()首先,d.getPair()秒。);
}否则如果(d.getType()== MODE_TEXT){
canvas.drawText(d.getText(),d.getX(),d.getY(),d.getPair()秒。);
}否则如果(d.getType()== MODE_ARROW){
canvas.drawLine(d.getStartX(),d.getStartY(),d.getX(),d.getY(),d.getPair()第二);
fillArrow(帆布,d.getStartX(),d.getStartY(),d.getX(),d.getY(),d.getPair()秒。);
}否则如果(d.getType()== MODE_CIRCLE){
RectF oval2 =新RectF(d.getStartX(),d.getStartY(),d.getX(),d.getY());
canvas.drawOval(oval2,d.getPair()秒。);
}否则如果(d.getType()== MODE_RECTANGLE){
canvas.drawRect(d.getStartX(),d.getStartY(),d.getX(),d.getY(),d.getPair()第二);
}否则如果(d.getType()== MODE_ERASE){
canvas.drawPath(d.getPair()首先,d.getPair()秒。);
}
}
canvas.save();
}
onTouch法
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
mScaleDetector.onTouchEvent(事件);
mGestureDetector.onTouchEvent(事件);
的PointF CURR =新的PointF(event.getX(),event.getY()); MX = event.getX()+ mDistX;
我= event.getY()+ mDistY; 如果(状态== || State.NONE状态== || State.DRAG状态== State.FLING){
开关(event.getAction()){
案例MotionEvent.ACTION_DOWN:
图形,drawflag = FALSE;
mStartX = MX;
mStartY =我; 如果(mMode服务== MODE_ARROW){
的mpath =新路径();
mLineDrawObject =新DrawObject(MODE_ARROW,对新<路径,油漆和GT;(的mpath,getLinePaint()));
图形,drawflag = TRUE;
}否则如果(mMode服务== MODE_TEXT){
图形,drawflag = TRUE;
}否则如果(mMode服务== MODE_CIRCLE){
的mpath =新路径();
mCircleDrawObject =新DrawObject(MODE_CIRCLE,对新<路径,油漆和GT;(的mpath,getCirclePaint()));
图形,drawflag = TRUE;
}否则如果(mMode服务== MODE_RECTANGLE){
的mpath =新路径();
mRectangleObject =新DrawObject(MODE_RECTANGLE,对新<路径,油漆和GT;(的mpath,getRectanglePaint()));
图形,drawflag = TRUE;
}否则如果(mMode服务== MODE_DRAWING){
的mpath =新路径();
mDrawingDrawObject =新DrawObject(MODE_DRAWING,对新<路径,油漆和GT;(的mpath,getDrawPaint()));
图形,drawflag = TRUE;
}否则如果(mMode服务== MODE_ERASE){
的mpath =新路径();
mEraseObject =新DrawObject(MODE_ERASE,对新<路径,油漆和GT;(的mpath,getErasePaint()));
图形,drawflag = TRUE;
}
如果(图形,drawflag ==真){
touch_start(MX,我的);
无效();
} last.set(CURR);
如果(一扔!= NULL){
fling.cancelFling();
}
的setState(State.DRAG);
打破; 案例MotionEvent.ACTION_MOVE:
如果(状态== State.DRAG&放大器;&放图形,drawflag == FALSE){
浮DELTAX = curr.x - last.x;
浮DELTAY = curr.y - last.y;
浮fixTransX = getFixDragTrans(DELTAX,viewWidth,
getImageWidth());
浮fixTransY = getFixDragTrans(DELTAY,viewHeight,
getImageHeight());
matrix.postTranslate(fixTransX,fixTransY); fixTrans();
last.set(curr.x,curr.y);
}
如果(图形,drawflag ==真){
TOUCH_MOVE(MX,我的);
无效();
}
打破; 案例MotionEvent.ACTION_UP:
如果(图形,drawflag ==真){
润色();
}
打破;
案例MotionEvent.ACTION_POINTER_UP:
的setState(State.NONE);
打破; }
} setImageMatrix(矩阵);
//mCanvas.concat(matrix); //
//用户自定义OnTouchListener
//
如果(userTouchListener!= NULL){
userTouchListener.onTouch(ⅴ,事件);
} //
// OnTouchImageViewListener设置:TouchImageView用户拖动。
//
如果(touchImageViewListener!= NULL){
touchImageViewListener.onMove();
} //
//表示事件已处理
//
返回true;
}
}
解决方案
您可以试试下面的onDraw和onTouch方法。
的onDraw
@覆盖
保护无效的onDraw(帆布油画){
onDrawReady = TRUE;
imageRenderedAtLeastOnce = TRUE;
如果(delayedZoomVariables!= NULL){
setZoom(delayedZoomVariables.scale,delayedZoomVariables.focusX,delayedZoomVariables.focusY,delayedZoomVariables.scaleType);
delayedZoomVariables = NULL;
}
super.onDraw(画布);
}
onTouch
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
mScaleDetector.onTouchEvent(事件);
mGestureDetector.onTouchEvent(事件);
的PointF CURR =新的PointF(event.getX(),event.getY()); 如果(状态== || State.NONE状态== || State.DRAG状态== State.FLING){
开关(event.getAction()){
案例MotionEvent.ACTION_DOWN:
last.set(CURR);
如果(一扔!= NULL)
fling.cancelFling();
的setState(State.DRAG);
打破; 案例MotionEvent.ACTION_MOVE:
如果(状态== State.DRAG){
浮DELTAX = curr.x - last.x;
浮DELTAY = curr.y - last.y;
浮fixTransX = getFixDragTrans(DELTAX,viewWidth,getImageWidth());
浮fixTransY = getFixDragTrans(DELTAY,viewHeight,getImageHeight());
matrix.postTranslate(fixTransX,fixTransY);
fixTrans();
last.set(curr.x,curr.y);
}
打破; 案例MotionEvent.ACTION_UP:
案例MotionEvent.ACTION_POINTER_UP:
的setState(State.NONE);
打破;
}
} setImageMatrix(矩阵); //
//用户自定义OnTouchListener
//
如果(userTouchListener!= NULL){
userTouchListener.onTouch(ⅴ,事件);
} //
// OnTouchImageViewListener设置:TouchImageView用户拖动。
//
如果(touchImageViewListener!= NULL){
touchImageViewListener.onMove();
} //
//表示事件已处理
//
返回true;
}
}
I am doing image annotations in android and I've added zooming functionality into it. So now when I am zooming the image and after that doing any annotation, its not on that point where I touched the screen rather than its doing on as that of original image (Unzoomed Image).
onDraw Method
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
onDrawReady = true;
imageRenderedAtLeastOnce = true;
canvas.concat(matrix);
for (DrawObject d : paths) {
if (d.getType() == MODE_DRAWING) {
canvas.drawPath(d.getPair().first, d.getPair().second);
} else if (d.getType() == MODE_TEXT) {
canvas.drawText(d.getText(), d.getX(), d.getY(), d.getPair().second);
} else if (d.getType() == MODE_ARROW) {
canvas.drawLine(d.getStartX(), d.getStartY(), d.getX(), d.getY(), d.getPair().second);
fillArrow(canvas, d.getStartX(), d.getStartY(), d.getX(), d.getY(), d.getPair().second);
} else if (d.getType() == MODE_CIRCLE) {
RectF oval2 = new RectF(d.getStartX(), d.getStartY(), d.getX(), d.getY());
canvas.drawOval(oval2, d.getPair().second);
} else if (d.getType() == MODE_RECTANGLE) {
canvas.drawRect(d.getStartX(), d.getStartY(), d.getX(), d.getY(), d.getPair().second);
} else if (d.getType() == MODE_ERASE) {
canvas.drawPath(d.getPair().first, d.getPair().second);
}
}
canvas.save();
}
onTouch Method
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
mGestureDetector.onTouchEvent(event);
PointF curr = new PointF(event.getX(), event.getY());
mX = event.getX() + mDistX;
mY = event.getY() + mDistY;
if (state == State.NONE || state == State.DRAG || state == State.FLING) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawFlag = false;
mStartX = mX;
mStartY = mY;
if (mMode == MODE_ARROW) {
mPath = new Path();
mLineDrawObject = new DrawObject(MODE_ARROW, new Pair<Path, Paint>(mPath, getLinePaint()));
drawFlag = true;
} else if (mMode == MODE_TEXT) {
drawFlag = true;
} else if (mMode == MODE_CIRCLE) {
mPath = new Path();
mCircleDrawObject = new DrawObject(MODE_CIRCLE, new Pair<Path, Paint>(mPath, getCirclePaint()));
drawFlag = true;
} else if (mMode == MODE_RECTANGLE) {
mPath = new Path();
mRectangleObject = new DrawObject(MODE_RECTANGLE, new Pair<Path, Paint>(mPath, getRectanglePaint()));
drawFlag = true;
} else if (mMode == MODE_DRAWING) {
mPath = new Path();
mDrawingDrawObject = new DrawObject(MODE_DRAWING, new Pair<Path, Paint>(mPath, getDrawPaint()));
drawFlag = true;
} else if (mMode == MODE_ERASE) {
mPath = new Path();
mEraseObject = new DrawObject(MODE_ERASE, new Pair<Path, Paint>(mPath, getErasePaint()));
drawFlag = true;
}
if (drawFlag == true) {
touch_start(mX, mY);
invalidate();
}
last.set(curr);
if (fling != null) {
fling.cancelFling();
}
setState(State.DRAG);
break;
case MotionEvent.ACTION_MOVE:
if (state == State.DRAG && drawFlag == false) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
float fixTransX = getFixDragTrans(deltaX, viewWidth,
getImageWidth());
float fixTransY = getFixDragTrans(deltaY, viewHeight,
getImageHeight());
matrix.postTranslate(fixTransX, fixTransY);
fixTrans();
last.set(curr.x, curr.y);
}
if (drawFlag == true) {
touch_move(mX, mY);
invalidate();
}
break;
case MotionEvent.ACTION_UP:
if (drawFlag == true) {
touch_up();
}
break;
case MotionEvent.ACTION_POINTER_UP:
setState(State.NONE);
break;
}
}
setImageMatrix(matrix);
//mCanvas.concat(matrix);
//
// User-defined OnTouchListener
//
if (userTouchListener != null) {
userTouchListener.onTouch(v, event);
}
//
// OnTouchImageViewListener is set: TouchImageView dragged by user.
//
if (touchImageViewListener != null) {
touchImageViewListener.onMove();
}
//
// indicate event was handled
//
return true;
}
}
解决方案
You can try below onDraw and onTouch Method.
onDraw
@Override
protected void onDraw(Canvas canvas) {
onDrawReady = true;
imageRenderedAtLeastOnce = true;
if (delayedZoomVariables != null) {
setZoom(delayedZoomVariables.scale, delayedZoomVariables.focusX, delayedZoomVariables.focusY, delayedZoomVariables.scaleType);
delayedZoomVariables = null;
}
super.onDraw(canvas);
}
onTouch
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
mGestureDetector.onTouchEvent(event);
PointF curr = new PointF(event.getX(), event.getY());
if (state == State.NONE || state == State.DRAG || state == State.FLING) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last.set(curr);
if (fling != null)
fling.cancelFling();
setState(State.DRAG);
break;
case MotionEvent.ACTION_MOVE:
if (state == State.DRAG) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
float fixTransX = getFixDragTrans(deltaX, viewWidth, getImageWidth());
float fixTransY = getFixDragTrans(deltaY, viewHeight, getImageHeight());
matrix.postTranslate(fixTransX, fixTransY);
fixTrans();
last.set(curr.x, curr.y);
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
setState(State.NONE);
break;
}
}
setImageMatrix(matrix);
//
// User-defined OnTouchListener
//
if(userTouchListener != null) {
userTouchListener.onTouch(v, event);
}
//
// OnTouchImageViewListener is set: TouchImageView dragged by user.
//
if (touchImageViewListener != null) {
touchImageViewListener.onMove();
}
//
// indicate event was handled
//
return true;
}
}
这篇关于触摸屏是根据缩放的图像不调整的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文