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