summaryrefslogtreecommitdiffstats
path: root/android/experimental/LibreOffice4Android/src/com/polites/android/ZoomAnimation.java
blob: c709a1b7b513911a06cb5c14152c2bf4e5947621 (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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
 * Copyright (c) 2012 Jason Polites
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.polites.android;

import android.graphics.PointF;

public class ZoomAnimation implements Animation {

	private boolean firstFrame = true;

	private float touchX;
	private float touchY;

	private float zoom;

	private float startX;
	private float startY;
	private float startScale;

	private float xDiff;
	private float yDiff;
	private float scaleDiff;

	private long animationLengthMS = 200;
	private long totalTime = 0;

	private ZoomAnimationListener zoomAnimationListener;

	/* (non-Javadoc)
	 * @see com.polites.android.Animation#update(com.polites.android.GestureImageView, long)
	 */
	@Override
	public boolean update(GestureImageView view, long time) {
		if(firstFrame) {
			firstFrame = false;

			startX = view.getImageX();
			startY = view.getImageY();
			startScale = view.getScale();
			scaleDiff = (zoom * startScale) - startScale;

			if(scaleDiff > 0) {
				// Calculate destination for midpoint
				VectorF vector = new VectorF();

				// Set the touch point as start because we want to move the end
				vector.setStart(new PointF(touchX, touchY));
				vector.setEnd(new PointF(startX, startY));

				vector.calculateAngle();

				// Get the current length
				float length = vector.calculateLength();

				// Multiply length by zoom to get the new length
				vector.length = length*zoom;

				// Now deduce the new endpoint
				vector.calculateEndPoint();

				xDiff = vector.end.x - startX;
				yDiff = vector.end.y - startY;
			}
			else {
				// Zoom out to center
				xDiff = view.getCenterX() - startX;
				yDiff = view.getCenterY() - startY;
			}
		}

		totalTime += time;

		float ratio = (float) totalTime / (float) animationLengthMS;

		if(ratio < 1) {

			if(ratio > 0) {
				// we still have time left
				float newScale = (ratio * scaleDiff) + startScale;
				float newX = (ratio * xDiff) + startX;
				float newY = (ratio * yDiff) + startY;

				if(zoomAnimationListener != null) {
					zoomAnimationListener.onZoom(newScale, newX, newY);
				}
			}

			return true;
		}
		else {

			float newScale = scaleDiff + startScale;
			float newX = xDiff + startX;
			float newY = yDiff + startY;

			if(zoomAnimationListener != null) {
				zoomAnimationListener.onZoom(newScale, newX, newY);
				zoomAnimationListener.onComplete();
			}

			return false;
		}
	}

	public void reset() {
		firstFrame = true;
		totalTime = 0;
	}

	public float getZoom() {
		return zoom;
	}

	public void setZoom(float zoom) {
		this.zoom = zoom;
	}

	public float getTouchX() {
		return touchX;
	}

	public void setTouchX(float touchX) {
		this.touchX = touchX;
	}

	public float getTouchY() {
		return touchY;
	}

	public void setTouchY(float touchY) {
		this.touchY = touchY;
	}

	public long getAnimationLengthMS() {
		return animationLengthMS;
	}

	public void setAnimationLengthMS(long animationLengthMS) {
		this.animationLengthMS = animationLengthMS;
	}

	public ZoomAnimationListener getZoomAnimationListener() {
		return zoomAnimationListener;
	}

	public void setZoomAnimationListener(ZoomAnimationListener zoomAnimationListener) {
		this.zoomAnimationListener = zoomAnimationListener;
	}
}