Reputation: 30855
I have problem to draw line on scaled and transformed image on canvas, well for the transformed I am able to draw line on image but if the image was scaled(zoom in or out) then line drew unexpectedly pixel using finger touch. As I am working on paint application but didn't have knowledge more about this so I need your help, I have searched it on google but no luck, I didn't found any thing
here is the images 1st is default working properly and in second moved image working properly drew the line properly
while in third on scaled image not properly draw, I mean if start draw from the top/left corner then the line drew point was different like here
if you need for code then say it I'll edit the question
Upvotes: 2
Views: 2518
Reputation: 30855
Ok after many implementation I got the solution for this.
This is my code for drawing in onDraw()
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.translate(mPosX, mPosY);
canvas.scale(mScaleFactor, mScaleFactor);
canvas.drawBitmap(MoveImageTestActivity.bmp, 0,0,null);
if(mScaleFactor!=1.f)
canvas.restore();
if(isDrawing)
canvas.drawPath(tempPath,get_paint());
if(mScaleFactor==1.f)
canvas.restore();
}
here you have to check for the scale factor value for restore the canvas. If the scale factor value was default that is 1.f and image was just move then restore after the draw line/path, if the scale factor was not equals to the 1.f (default) then restore the canvas 1st then draw line/path at using finger touch drawing time.
here is my onTouch() code
@Override
public boolean onTouchEvent(MotionEvent ev) {
mScaleDetector.onTouchEvent(ev);
final int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
final float x = ev.getX();
final float y = ev.getY();
if(isDrawing){
float dx = ev.getX();
float dy = ev.getY();;
if(mScaleFactor==1.f){
dx = ev.getX() - mPosX;
dy = ev.getY() - mPosY;
}
tempPath = new Path();
tempPath.moveTo(dx,dy);
}else{
mLastTouchX = x;
mLastTouchY = y;
// Save the ID of this pointer
mActivePointerId = ev.getPointerId(0);
}
break;
}
case MotionEvent.ACTION_MOVE: {
// Find the index of the active pointer and fetch its position
if(isDrawing){
float dx = ev.getX();
float dy = ev.getY();;
if(mScaleFactor==1.f){
dx = ev.getX() - mPosX;
dy = ev.getY() - mPosY;
}
tempPath.lineTo(dx,dy);
}else{
final int pointerIndex = ev.findPointerIndex(mActivePointerId);
final float x = ev.getX(pointerIndex);
final float y = ev.getY(pointerIndex);
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
mLastTouchX = x;
mLastTouchY = y;
}
break;
}
case MotionEvent.ACTION_UP: {
points.clear();
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
if(!isDrawing){
// Extract the index of the pointer that left the touch sensor
final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = ev.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = ev.getX(newPointerIndex);
mLastTouchY = ev.getY(newPointerIndex);
mActivePointerId = ev.getPointerId(newPointerIndex);
}
}
break;
}
}
invalidate();
return true;
}
Upvotes: 2