summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/filtershow/imageshow/ImageZoom.java
blob: a2b119cfe9d74de262b4c24339f2f61206c203bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.android.gallery3d.filtershow.imageshow;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;

public class ImageZoom extends ImageSlave implements OnGestureListener, OnDoubleTapListener {
    private boolean mTouchDown = false;
    private boolean mZoomedIn = false;
    private Rect mZoomBounds = null;
    private GestureDetector mGestureDetector = null;

    public ImageZoom(Context context) {
        super(context);
        setupGestureDetector(context);
    }

    public ImageZoom(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupGestureDetector(context);
    }

    public void setupGestureDetector(Context context) {
        mGestureDetector = new GestureDetector(context, this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        boolean ret = mGestureDetector.onTouchEvent(event);
        ret = super.onTouchEvent(event);
        return ret;
    }

    @Override
    public void onTouchDown(float x, float y) {
        super.onTouchDown(x, y);
        if (mZoomedIn || mTouchDown) {
            return;
        }
        mTouchDown = true;
        Rect originalBounds = mImageLoader.getOriginalBounds();
        Rect imageBounds = getImageBounds();
        float touchX = x - imageBounds.left;
        float touchY = y - imageBounds.top;

        float w = originalBounds.width();
        float h = originalBounds.height();
        float ratio = w / h;
        int mw = getWidth() / 2;
        int mh = getHeight() / 2;
        int cx = (int) (w / 2);
        int cy = (int) (h / 2);
        cx = (int) (touchX / imageBounds.width() * w);
        cy = (int) (touchY / imageBounds.height() * h);
        int left = cx - mw;
        int top = cy - mh;
        mZoomBounds = new Rect(left, top, left + mw * 2, top + mh * 2);
    }

    @Override
    public void onTouchUp() {
        mTouchDown = false;
    }

    @Override
    public void onDraw(Canvas canvas) {
        drawBackground(canvas);
        Bitmap filteredImage = null;
        if ((mZoomedIn ||mTouchDown) && mImageLoader != null) {
            filteredImage = mImageLoader.getScaleOneImageForPreset(this, getImagePreset(), mZoomBounds, false);
        } else {
            getFilteredImage();
            filteredImage = mFilteredImage;
        }
        drawImage(canvas, filteredImage);
        if (showControls()) {
            mSliderController.onDraw(canvas);
        }

        drawToast(canvas);
    }

    // TODO: move back some of that touch handling to a superclass / refactor
    // SlideController into a more generic gesture detector
    @Override
    public boolean onDown(MotionEvent arg0) {
        return false;
    }

    @Override
    public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent arg0) {
    }

    @Override
    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2, float arg3) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent arg0) {
    }

    @Override
    public boolean onSingleTapUp(MotionEvent arg0) {
        return false;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent arg0) {
        return false;
    }

    @Override
    public boolean onDoubleTap(MotionEvent event) {

        if (!mZoomedIn) {
            onTouchDown(event.getX(), event.getY());
        } else {
            onTouchUp();
        }
        mZoomedIn = !mZoomedIn;
        invalidate();
        return false;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent arg0) {
        return false;
    }
}