• After 15+ years, we've made a big change: Android Forums is now Early Bird Club. Learn more here.

Apps Zoom on Custom View Canvas

abelsuviri

Lurker
I am developing a drawing application and I would like to add the ability to zoom the canvas. I explain a bit my code:

When I draw I get the bitmap of the canvas and save it to an ArrayList (this is for undo the draws, I tried with drawing paths and saving to a path arraylist but I cannot draw text, so I used that method). I have a boolean variable to check if the zoom is enabled or not. This is due because while you press the screen it will be draw something (a line, a cicle...) and I use this variable at onDraw and onTouchEvent for disable the drawing and enable zoom.

When I draw there is no problem but when I tried to use the zoom it does nothing. I was searching a lot about zoom but I cannot implement it into my application. The following code is my last code I tried to implement zoom.

Java:
private boolean zoomenable=false;
private ArrayList<Bitmap> bmps=new ArrayList<Bitmap>();
private static float MIN_ZOOM=1f;
private static float MAX_ZOOM=5f;
private float scaleFactor=1.f;
private ScaleGestureDetector detector;
private static int NONE=0;
private static int DRAG=1;
private static int ZOOM=2;
private int mode;
private float startX=0f;
private float startY=0f;
private float translateX=0f;
private float translateY=0f;
private float previusTranslateX=0f;
private float previusTranslateY=0f;
private boolean dragged=false;
private float displayWidth;
private float displayHeight;

public DrawingView(Context context, AttributeSet attrs){
    super(context, attrs);
    detector=new ScaleGestureDetector(getContext(), new ScaleListener());
    WindowManager wm=(WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
    Display display=wm.getDefaultDisplay();
    displayHeight=display.getHeight();
    displayWidth=display.getWidth();

    //Draw setup (create path, paint, set color, stroke...)
}

protected void onDraw(Canvas canvas){

    if(zoomenable==true) {

        canvas.save();

        if(bmps.size()==1){
            bmps.add(canvasBitmap);
        }
        canvas.drawBitmap(bmps.get(bmps.size() - 1), 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);

        canvas.scale(scaleFactor, scaleFactor);
        if (translateX * -1 < 0) {
            translateX = 0;
        } else if ((translateX * -1) > (scaleFactor - 1) * displayWidth) {
            translateX = (1 - scaleFactor) * displayWidth;
        }

        if (translateY * -1 < 0) {
            translateY = 0;
        } else if ((translateY * -1) > (scaleFactor - 1) * displayHeight) {
            translateY = (1 - scaleFactor) * displayHeight;
        }
        canvas.translate(translateX / scaleFactor, translateY / scaleFactor);
        canvas.restore();
    }else {

    //Draw shapes preview   

    }
}

public boolean onTouchEvent(MotionEvent event){

    if(zoomenable==false) {

        //touch events for drawing

    }
    if(zoomenable==true){
        switch (event.getAction()&MotionEvent.ACTION_MASK){
            case MotionEvent.ACTION_DOWN:
                mode=DRAG;
                startX=event.getX()-previusTranslateX;
                startY=event.getY()-previusTranslateY;
                break;

            case MotionEvent.ACTION_MOVE:
                translateX=event.getX()-startX;
                translateY=event.getY()-startY;
                double distance=Math.sqrt(Math.pow(event.getX()-(startX+previusTranslateX),2)+Math.pow(event.getY()-(startY+previusTranslateY),2));
                if(distance>0){
                    dragged=true;
                }
                break;

            case MotionEvent.ACTION_POINTER_DOWN:
                mode=ZOOM;
                break;

            case MotionEvent.ACTION_UP:
                mode=NONE;
                dragged=false;
                previusTranslateY=translateY;
                previusTranslateX=translateX;
                break;

            case MotionEvent.ACTION_POINTER_UP:
                mode=DRAG;
                previusTranslateX=translateX;
                previusTranslateY=translateY;
                break;
        }
        detector.onTouchEvent(event);
        if((mode==DRAG&&scaleFactor!=1f&&dragged)||mode==ZOOM){
            invalidate();
        }
    }
    return true;
}
 
Back
Top Bottom