From 2aaf8c5663e44082ccf6dc4a5cc4adac4db430d1 Mon Sep 17 00:00:00 2001 From: BlueRiverInteractive Date: Sun, 24 May 2015 16:43:38 +0200 Subject: [PATCH] Update Touches sample (#41). --- .../org/robovm/samples/launchme/LaunchMe.java | 2 +- .../launchme/ui/RootViewController.java | 2 +- Touches/build.gradle | 3 - Touches/resources/Default-667h@2x~iphone.png | Bin 10241 -> 0 bytes Touches/resources/Default-736h@3x~iphone.png | Bin 11761 -> 0 bytes Touches/resources/Icon-72.png | Bin 20606 -> 0 bytes Touches/resources/Icon-72@2x.png | Bin 22299 -> 0 bytes Touches/resources/Icon.png | Bin 20352 -> 0 bytes Touches/robovm.properties | 6 - .../org/robovm/samples/touches/Touches.java | 63 ---- .../GestureViewController.java | 291 ------------------ {Touches => TouchesGesture}/Info.plist.xml | 36 +-- TouchesGesture/build.gradle | 3 + {Touches => TouchesGesture}/pom.xml | 2 +- .../resources/Base.lproj/Main.storyboard | 155 ++++++++++ .../resources/CyanSquare.png | Bin .../AppIcon.appiconset/Contents.json | 80 +++++ .../AppIcon.appiconset}/Icon-60@2x.png | Bin .../AppIcon.appiconset}/Icon-60@3x.png | Bin .../AppIcon.appiconset}/Icon-76.png | Bin .../AppIcon.appiconset}/Icon-76@2x.png | Bin .../AppIcon.appiconset}/Icon-Small-40.png | Bin .../AppIcon.appiconset/Icon-Small-40@2x-1.png | Bin .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 0 -> 1265 bytes .../AppIcon.appiconset}/Icon-Small-40@3x.png | Bin .../AppIcon.appiconset}/Icon-Small.png | Bin .../AppIcon.appiconset/Icon-Small@2x-1.png | Bin .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 942 bytes .../AppIcon.appiconset}/Icon-Small@3x.png | Bin .../LaunchImage.launchimage/Contents.json | 57 ++++ .../Default-568h@2x~iphone.png | Bin .../Default-Landscape@2x~ipad.png | Bin .../Default-Landscape~ipad.png | Bin .../Default-Portrait@2x~ipad.png | Bin .../Default-Portrait~ipad.png | Bin .../Default@2x~iphone.png | Bin .../resources/MagentaSquare.png | Bin .../resources/YellowSquare.png | Bin TouchesGesture/robovm.properties | 6 + {Touches => TouchesGesture}/robovm.xml | 4 +- .../touchesgesture/TouchesGesture.java | 38 +++ .../touchesgesture/ui/APLViewController.java | 249 +++++++++++++++ TouchesResponder/Info.plist.xml | 54 ++++ TouchesResponder/build.gradle | 3 + TouchesResponder/pom.xml | 32 ++ .../resources/Base.lproj/Main.storyboard | 101 ++++++ TouchesResponder/resources/CyanSquare.png | Bin 0 -> 6426 bytes .../AppIcon.appiconset/Contents.json | 80 +++++ .../AppIcon.appiconset/Icon-60@2x.png | Bin 0 -> 1721 bytes .../AppIcon.appiconset/Icon-60@3x.png | Bin 0 -> 2710 bytes .../AppIcon.appiconset/Icon-76.png | Bin 0 -> 1285 bytes .../AppIcon.appiconset/Icon-76@2x.png | Bin 0 -> 2294 bytes .../AppIcon.appiconset/Icon-Small-40.png | Bin 0 -> 689 bytes .../AppIcon.appiconset/Icon-Small-40@2x-1.png | Bin 0 -> 1265 bytes .../AppIcon.appiconset/Icon-Small-40@2x.png | Bin 0 -> 1265 bytes .../AppIcon.appiconset/Icon-Small-40@3x.png | Bin 0 -> 1721 bytes .../AppIcon.appiconset/Icon-Small.png | Bin 0 -> 524 bytes .../AppIcon.appiconset/Icon-Small@2x-1.png | Bin 0 -> 942 bytes .../AppIcon.appiconset/Icon-Small@2x.png | Bin 0 -> 942 bytes .../AppIcon.appiconset/Icon-Small@3x.png | Bin 0 -> 1360 bytes .../LaunchImage.launchimage/Contents.json | 57 ++++ .../Default-568h@2x~iphone.png | Bin 0 -> 8512 bytes .../Default-Landscape@2x~ipad.png | Bin 0 -> 15450 bytes .../Default-Landscape~ipad.png | Bin 0 -> 11239 bytes .../Default-Portrait@2x~ipad.png | Bin 0 -> 14917 bytes .../Default-Portrait~ipad.png | Bin 0 -> 10758 bytes .../Default@2x~iphone.png | Bin 0 -> 8794 bytes TouchesResponder/resources/MagentaSquare.png | Bin 0 -> 6606 bytes TouchesResponder/resources/YellowSquare.png | Bin 0 -> 3843 bytes TouchesResponder/robovm.properties | 6 + TouchesResponder/robovm.xml | 13 + .../touchesresponder/TouchesResponder.java | 38 +++ .../ui/APLViewController.java | 249 ++++++++------- 73 files changed, 1117 insertions(+), 513 deletions(-) delete mode 100644 Touches/build.gradle delete mode 100644 Touches/resources/Default-667h@2x~iphone.png delete mode 100644 Touches/resources/Default-736h@3x~iphone.png delete mode 100644 Touches/resources/Icon-72.png delete mode 100644 Touches/resources/Icon-72@2x.png delete mode 100644 Touches/resources/Icon.png delete mode 100644 Touches/robovm.properties delete mode 100644 Touches/src/main/java/org/robovm/samples/touches/Touches.java delete mode 100644 Touches/src/main/java/org/robovm/samples/touches/viewcontrollers/GestureViewController.java rename {Touches => TouchesGesture}/Info.plist.xml (62%) create mode 100644 TouchesGesture/build.gradle rename {Touches => TouchesGesture}/pom.xml (93%) create mode 100644 TouchesGesture/resources/Base.lproj/Main.storyboard rename {Touches => TouchesGesture}/resources/CyanSquare.png (100%) create mode 100644 TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Contents.json rename {Touches/resources => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset}/Icon-60@2x.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset}/Icon-60@3x.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset}/Icon-76.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset}/Icon-76@2x.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset}/Icon-Small-40.png (100%) rename Touches/resources/Icon-Small-40@2x.png => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png (100%) create mode 100644 TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png rename {Touches/resources => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset}/Icon-Small-40@3x.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset}/Icon-Small.png (100%) rename Touches/resources/Icon-Small@2x.png => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png (100%) create mode 100644 TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png rename {Touches/resources => TouchesGesture/resources/Images.xcassets/AppIcon.appiconset}/Icon-Small@3x.png (100%) create mode 100644 TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Contents.json rename {Touches/resources => TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage}/Default-568h@2x~iphone.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage}/Default-Landscape@2x~ipad.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage}/Default-Landscape~ipad.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage}/Default-Portrait@2x~ipad.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage}/Default-Portrait~ipad.png (100%) rename {Touches/resources => TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage}/Default@2x~iphone.png (100%) rename {Touches => TouchesGesture}/resources/MagentaSquare.png (100%) rename {Touches => TouchesGesture}/resources/YellowSquare.png (100%) create mode 100644 TouchesGesture/robovm.properties rename {Touches => TouchesGesture}/robovm.xml (100%) create mode 100644 TouchesGesture/src/main/java/org/robovm/samples/touchesgesture/TouchesGesture.java create mode 100644 TouchesGesture/src/main/java/org/robovm/samples/touchesgesture/ui/APLViewController.java create mode 100644 TouchesResponder/Info.plist.xml create mode 100644 TouchesResponder/build.gradle create mode 100644 TouchesResponder/pom.xml create mode 100644 TouchesResponder/resources/Base.lproj/Main.storyboard create mode 100644 TouchesResponder/resources/CyanSquare.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-76.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png create mode 100644 TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png create mode 100644 TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png create mode 100644 TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png create mode 100644 TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png create mode 100644 TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png create mode 100644 TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png create mode 100644 TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png create mode 100644 TouchesResponder/resources/MagentaSquare.png create mode 100644 TouchesResponder/resources/YellowSquare.png create mode 100644 TouchesResponder/robovm.properties create mode 100644 TouchesResponder/robovm.xml create mode 100644 TouchesResponder/src/main/java/org/robovm/samples/touchesresponder/TouchesResponder.java rename Touches/src/main/java/org/robovm/samples/touches/viewcontrollers/TouchViewController.java => TouchesResponder/src/main/java/org/robovm/samples/touchesresponder/ui/APLViewController.java (50%) diff --git a/LaunchMe/src/main/java/org/robovm/samples/launchme/LaunchMe.java b/LaunchMe/src/main/java/org/robovm/samples/launchme/LaunchMe.java index b7ef0a58..f7ddc9b8 100644 --- a/LaunchMe/src/main/java/org/robovm/samples/launchme/LaunchMe.java +++ b/LaunchMe/src/main/java/org/robovm/samples/launchme/LaunchMe.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * Portions of this code is based on Apple Inc's LaunchMe sample (v170) + * Portions of this code is based on Apple Inc's LaunchMe sample (v1.7) * which is copyright (C) 2008-2013 Apple Inc. */ package org.robovm.samples.launchme; diff --git a/LaunchMe/src/main/java/org/robovm/samples/launchme/ui/RootViewController.java b/LaunchMe/src/main/java/org/robovm/samples/launchme/ui/RootViewController.java index ca16a2f6..f617f4a3 100644 --- a/LaunchMe/src/main/java/org/robovm/samples/launchme/ui/RootViewController.java +++ b/LaunchMe/src/main/java/org/robovm/samples/launchme/ui/RootViewController.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * Portions of this code is based on Apple Inc's LaunchMe sample (v170) + * Portions of this code is based on Apple Inc's LaunchMe sample (v1.7) * which is copyright (C) 2008-2013 Apple Inc. */ package org.robovm.samples.launchme.ui; diff --git a/Touches/build.gradle b/Touches/build.gradle deleted file mode 100644 index e0e3d3a1..00000000 --- a/Touches/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -ext { - mainClassName = "org.robovm.samples.touches.Touches" -} \ No newline at end of file diff --git a/Touches/resources/Default-667h@2x~iphone.png b/Touches/resources/Default-667h@2x~iphone.png deleted file mode 100644 index 54ead7d94747bbebd78617f032bcfdb81409bbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10241 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 FzW^~1$b$d? diff --git a/Touches/resources/Icon-72@2x.png b/Touches/resources/Icon-72@2x.png deleted file mode 100644 index 43a08526b6cb9ee21a6b0dabcd2526baa8f1dfdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22299 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 diff --git a/Touches/resources/Icon.png b/Touches/resources/Icon.png deleted file mode 100644 index af4733a5cb157318936596e1b1c514d924cc0976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20352 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 EFZr=c2><{9 diff --git a/Touches/robovm.properties b/Touches/robovm.properties deleted file mode 100644 index 0ff0fb6b..00000000 --- a/Touches/robovm.properties +++ /dev/null @@ -1,6 +0,0 @@ -app.version=1.0 -app.id=org.robovm.samples.touches -app.mainclass=org.robovm.samples.touches.Touches -app.executable=Touches -app.build=1 -app.name=Touches \ No newline at end of file diff --git a/Touches/src/main/java/org/robovm/samples/touches/Touches.java b/Touches/src/main/java/org/robovm/samples/touches/Touches.java deleted file mode 100644 index e0b98ba2..00000000 --- a/Touches/src/main/java/org/robovm/samples/touches/Touches.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2014 RoboVM AB - * - * 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. - * - * Portions of this code is based on Apple Inc's Touches sample (v2.0) - * which is copyright (C) 2008-2013 Apple Inc. - */ - -package org.robovm.samples.touches; - -import org.robovm.apple.foundation.NSAutoreleasePool; -import org.robovm.apple.uikit.UIApplication; -import org.robovm.apple.uikit.UIApplicationDelegateAdapter; -import org.robovm.apple.uikit.UIApplicationLaunchOptions; -import org.robovm.apple.uikit.UIScreen; -import org.robovm.apple.uikit.UITabBarController; -import org.robovm.apple.uikit.UIWindow; -import org.robovm.samples.touches.viewcontrollers.GestureViewController; -import org.robovm.samples.touches.viewcontrollers.TouchViewController; - -public class Touches extends UIApplicationDelegateAdapter { - private UIWindow window; - private UITabBarController rootViewController; - private TouchViewController touchViewController; - private GestureViewController gestureViewController; - - @Override - public boolean didFinishLaunching (UIApplication application, UIApplicationLaunchOptions launchOptions) { - // Set up the view controller. - rootViewController = new UITabBarController(); - - touchViewController = new TouchViewController(); - rootViewController.addChildViewController(touchViewController); - gestureViewController = new GestureViewController(); - rootViewController.addChildViewController(gestureViewController); - - // Create a new window at screen size. - window = new UIWindow(UIScreen.getMainScreen().getBounds()); - // Set our viewcontroller as the root controller for the window. - window.setRootViewController(rootViewController); - // Make the window visible. - window.makeKeyAndVisible(); - - return true; - } - - public static void main (String[] args) { - NSAutoreleasePool pool = new NSAutoreleasePool(); - UIApplication.main(args, null, Touches.class); - pool.close(); - } -} diff --git a/Touches/src/main/java/org/robovm/samples/touches/viewcontrollers/GestureViewController.java b/Touches/src/main/java/org/robovm/samples/touches/viewcontrollers/GestureViewController.java deleted file mode 100644 index c071b257..00000000 --- a/Touches/src/main/java/org/robovm/samples/touches/viewcontrollers/GestureViewController.java +++ /dev/null @@ -1,291 +0,0 @@ -/* - * Copyright (C) 2014 RoboVM AB - * - * 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. - * - * Portions of this code is based on Apple Inc's Touches sample (v2.0) - * which is copyright (C) 2008-2013 Apple Inc. - */ - -package org.robovm.samples.touches.viewcontrollers; - -import org.robovm.apple.coregraphics.CGAffineTransform; -import org.robovm.apple.coregraphics.CGPoint; -import org.robovm.apple.coregraphics.CGRect; -import org.robovm.apple.foundation.NSArray; -import org.robovm.apple.uikit.NSTextAlignment; -import org.robovm.apple.uikit.UIColor; -import org.robovm.apple.uikit.UIFont; -import org.robovm.apple.uikit.UIGestureRecognizer; -import org.robovm.apple.uikit.UIGestureRecognizerDelegate; -import org.robovm.apple.uikit.UIGestureRecognizerDelegateAdapter; -import org.robovm.apple.uikit.UIGestureRecognizerState; -import org.robovm.apple.uikit.UIImage; -import org.robovm.apple.uikit.UIImageView; -import org.robovm.apple.uikit.UILabel; -import org.robovm.apple.uikit.UILongPressGestureRecognizer; -import org.robovm.apple.uikit.UIMenuController; -import org.robovm.apple.uikit.UIMenuItem; -import org.robovm.apple.uikit.UIPanGestureRecognizer; -import org.robovm.apple.uikit.UIPinchGestureRecognizer; -import org.robovm.apple.uikit.UIRotationGestureRecognizer; -import org.robovm.apple.uikit.UIView; -import org.robovm.apple.uikit.UIViewController; - -public class GestureViewController extends UIViewController { - private final UIImageView firstPieceView; - private final UIImageView secondPieceView; - private final UIImageView thirdPieceView; - - private UIView pieceForReset; - - public GestureViewController() { - getTabBarItem().setTitle("Gestures"); - - createGestureRecognizers(); - - UIView view = getView(); - view.setBackgroundColor(UIColor.darkText()); - - firstPieceView = new UIImageView(UIImage.create("CyanSquare.png")); - firstPieceView.setFrame(new CGRect(110, 190, 100, 100)); - firstPieceView.setUserInteractionEnabled(true); - firstPieceView.setAlpha(0.9); - firstPieceView.setGestureRecognizers(createGestureRecognizers()); - view.addSubview(firstPieceView); - - secondPieceView = new UIImageView(UIImage.create("MagentaSquare.png")); - secondPieceView.setFrame(new CGRect(210, 290, 100, 100)); - secondPieceView.setUserInteractionEnabled(true); - secondPieceView.setAlpha(0.9); - secondPieceView.setGestureRecognizers(createGestureRecognizers()); - view.addSubview(secondPieceView); - - thirdPieceView = new UIImageView(UIImage.create("YellowSquare.png")); - thirdPieceView.setFrame(new CGRect(10, 90, 100, 100)); - thirdPieceView.setUserInteractionEnabled(true); - thirdPieceView.setAlpha(0.9); - thirdPieceView.setGestureRecognizers(createGestureRecognizers()); - view.addSubview(thirdPieceView); - - UILabel title = new UILabel(new CGRect(10, 24, 300, 21)); - title.setText("\"Touches\"; shows use of"); - title.setFont(UIFont.getSystemFont(16)); - title.setTextColor(UIColor.white()); - title.setTextAlignment(NSTextAlignment.Center); - view.addSubview(title); - - UILabel subtitle = new UILabel(new CGRect(10, 45, 300, 21)); - subtitle.setText("UIGestureRecognizers to move pieces."); - subtitle.setFont(UIFont.getSystemFont(16)); - subtitle.setTextColor(UIColor.white()); - subtitle.setTextAlignment(NSTextAlignment.Center); - view.addSubview(subtitle); - } - - private NSArray createGestureRecognizers() { - UIGestureRecognizerDelegate gestureRecognizerDelegate = new UIGestureRecognizerDelegateAdapter() { - /** - * Ensure that the pinch, pan and rotate gesture recognizers on a - * particular view can all recognize simultaneously. Prevent other - * gesture recognizers from recognizing simultaneously. - */ - @Override - public boolean shouldRecognizeSimultaneously(UIGestureRecognizer gestureRecognizer, - UIGestureRecognizer otherGestureRecognizer) { - - // If the gesture recognizers's view isn't one of our pieces, - // don't allow simultaneous recognition. - if (gestureRecognizer.getView() != firstPieceView && gestureRecognizer.getView() != secondPieceView - && gestureRecognizer.getView() != thirdPieceView) { - return false; - } - - // If the gesture recognizers are on different views, don't - // allow simultaneous recognition. - if (gestureRecognizer.getView() != otherGestureRecognizer.getView()) { - return false; - } - - // If either of the gesture recognizers is the long press, don't - // allow simultaneous recognition. - if (gestureRecognizer instanceof UILongPressGestureRecognizer - || otherGestureRecognizer instanceof UILongPressGestureRecognizer) { - return false; - } - - return true; - } - }; - - UIRotationGestureRecognizer rotationGestureRecognizer = new UIRotationGestureRecognizer( - new UIGestureRecognizer.OnGestureListener() { - @Override - public void onGesture(UIGestureRecognizer gestureRecognizer) { - rotatePiece((UIRotationGestureRecognizer) gestureRecognizer); - } - }); - UIPinchGestureRecognizer pinchGestureRecognizer = new UIPinchGestureRecognizer( - new UIGestureRecognizer.OnGestureListener() { - @Override - public void onGesture(UIGestureRecognizer gestureRecognizer) { - scalePiece((UIPinchGestureRecognizer) gestureRecognizer); - } - }); - UIPanGestureRecognizer panGestureRecognizer = new UIPanGestureRecognizer( - new UIGestureRecognizer.OnGestureListener() { - @Override - public void onGesture(UIGestureRecognizer gestureRecognizer) { - panPiece((UIPanGestureRecognizer) gestureRecognizer); - } - }); - UILongPressGestureRecognizer longPressGestureRecognizer = new UILongPressGestureRecognizer( - new UIGestureRecognizer.OnGestureListener() { - @Override - public void onGesture(UIGestureRecognizer gestureRecognizer) { - showResetMenu((UILongPressGestureRecognizer) gestureRecognizer); - } - }); - - NSArray gestureRecognizers = new NSArray<>(rotationGestureRecognizer, - pinchGestureRecognizer, - panGestureRecognizer, longPressGestureRecognizer); - for (UIGestureRecognizer gestureRecognizer : gestureRecognizers) { - gestureRecognizer.setDelegate(gestureRecognizerDelegate); - } - return gestureRecognizers; - } - - /** - * Scale and rotation transforms are applied relative to the layer's anchor - * point this method moves a gesture recognizer's view's anchor point - * between the user's fingers. - */ - private void adjustAnchorPointForGestureRecognizer(UIGestureRecognizer gestureRecognizer) { - if (gestureRecognizer.getState() == UIGestureRecognizerState.Began) { - UIView piece = gestureRecognizer.getView(); - CGPoint locationInView = gestureRecognizer.getLocationInView(piece); - CGPoint locationInSuperview = gestureRecognizer.getLocationInView(piece.getSuperview()); - - piece.getLayer().setAnchorPoint( - new CGPoint(locationInView.getX() / piece.getBounds().getSize().getWidth(), locationInView.getY() - / piece.getBounds().getSize().getHeight())); - piece.setCenter(locationInSuperview); - } - } - - /** - * Display a menu with a single item to allow the piece's transform to be - * reset. - */ - private void showResetMenu(final UILongPressGestureRecognizer gestureRecognizer) { - if (gestureRecognizer.getState() == UIGestureRecognizerState.Began) { - becomeFirstResponder(); - pieceForReset = gestureRecognizer.getView(); - - /* - * Set up the reset menu. - */ - UIMenuItem resetMenuItem = new UIMenuItem("Reset", new UIMenuItem.OnActionListener() { - @Override - public void onAction(UIMenuController menuController, UIMenuItem item) { - resetPiece(menuController); - } - }); - - UIMenuController menuController = UIMenuController.getSharedMenuController(); - menuController.setMenuItems(new NSArray<>(resetMenuItem)); - - CGPoint location = gestureRecognizer.getLocationInView(gestureRecognizer.getView()); - CGRect menuLocation = new CGRect(location.getX(), location.getY(), 0, 0); - menuController.setTargetRect(menuLocation, gestureRecognizer.getView()); - - menuController.setMenuVisible(true, true); - } - } - - /** Animate back to the default anchor point and transform. */ - private void resetPiece(UIMenuController controller) { - CGPoint centerPoint = new CGPoint(pieceForReset.getBounds().getMidX(), pieceForReset.getBounds().getMidY()); - CGPoint locationInSuperview = pieceForReset.convertPointToView(centerPoint, pieceForReset.getSuperview()); - - pieceForReset.getLayer().setAnchorPoint(new CGPoint(0.5, 0.5)); - pieceForReset.setCenter(locationInSuperview); - - UIView.beginAnimations(null, null); - pieceForReset.setTransform(CGAffineTransform.Identity()); - UIView.commitAnimations(); - } - - @Override - public boolean canBecomeFirstResponder() { - /* - * UIMenuController requires that we can become first responder or it - * won't display. - */ - return true; - } - - /** - * Shift the piece's center by the pan amount. Reset the gesture - * recognizer's translation to {0, 0} after applying so the next callback is - * a delta from the current position. - */ - private void panPiece(UIPanGestureRecognizer gestureRecognizer) { - UIView piece = gestureRecognizer.getView(); - - adjustAnchorPointForGestureRecognizer(gestureRecognizer); - - if (gestureRecognizer.getState() == UIGestureRecognizerState.Began - || gestureRecognizer.getState() == UIGestureRecognizerState.Changed) { - CGPoint translation = gestureRecognizer.getTranslation(piece.getSuperview()); - - piece.setCenter(new CGPoint(piece.getCenter().getX() + translation.getX(), piece.getCenter().getY() - + translation.getY())); - gestureRecognizer.setTranslation(CGPoint.Zero(), piece.getSuperview()); - } - } - - /** - * Rotate the piece by the current rotation. Reset the gesture recognizer's - * rotation to 0 after applying so the next callback is a delta from the - * current rotation. - */ - private void rotatePiece(UIRotationGestureRecognizer gestureRecognizer) { - adjustAnchorPointForGestureRecognizer(gestureRecognizer); - - if (gestureRecognizer.getState() == UIGestureRecognizerState.Began - || gestureRecognizer.getState() == UIGestureRecognizerState.Changed) { - gestureRecognizer.getView().setTransform( - gestureRecognizer.getView().getTransform().rotate(gestureRecognizer.getRotation())); - gestureRecognizer.setRotation(0); - } - } - - /** - * Scale the piece by the current scale. Reset the gesture recognizer's - * rotation to 0 after applying so the next callback is a delta from the - * current scale. - */ - private void scalePiece(UIPinchGestureRecognizer gestureRecognizer) { - adjustAnchorPointForGestureRecognizer(gestureRecognizer); - - if (gestureRecognizer.getState() == UIGestureRecognizerState.Began - || gestureRecognizer.getState() == UIGestureRecognizerState.Changed) { - gestureRecognizer.getView().setTransform( - gestureRecognizer.getView().getTransform() - .scale(gestureRecognizer.getScale(), gestureRecognizer.getScale())); - gestureRecognizer.setScale(1); - } - } -} diff --git a/Touches/Info.plist.xml b/TouchesGesture/Info.plist.xml similarity index 62% rename from Touches/Info.plist.xml rename to TouchesGesture/Info.plist.xml index 13dd2ec7..8fad5307 100644 --- a/Touches/Info.plist.xml +++ b/TouchesGesture/Info.plist.xml @@ -24,6 +24,10 @@ ${app.build} LSRequiresIPhoneOS + UIMainStoryboardFile + Main + MinimumOSVersion + 8.0 UIDeviceFamily 1 @@ -36,37 +40,15 @@ UISupportedInterfaceOrientations UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight - CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - Icon-Small - Icon-Small-40 - Icon - Icon-60 - Icon-72 - - - - CFBundleIcons~ipad - - CFBundlePrimaryIcon - - CFBundleIconFiles - - Icon-Small - Icon-Small-40 - Icon-72 - Icon-76 - - - diff --git a/TouchesGesture/build.gradle b/TouchesGesture/build.gradle new file mode 100644 index 00000000..f74c8162 --- /dev/null +++ b/TouchesGesture/build.gradle @@ -0,0 +1,3 @@ +ext { + mainClassName = "org.robovm.samples.touchesgesture.TouchesGesture" +} \ No newline at end of file diff --git a/Touches/pom.xml b/TouchesGesture/pom.xml similarity index 93% rename from Touches/pom.xml rename to TouchesGesture/pom.xml index 31d74943..8bb103d0 100644 --- a/Touches/pom.xml +++ b/TouchesGesture/pom.xml @@ -10,7 +10,7 @@ 1.0 - robovm-samples-touches + robovm-samples-touchesgesture RoboVM port of Apple's Touches sample jar diff --git a/TouchesGesture/resources/Base.lproj/Main.storyboard b/TouchesGesture/resources/Base.lproj/Main.storyboard new file mode 100644 index 00000000..95081e74 --- /dev/null +++ b/TouchesGesture/resources/Base.lproj/Main.storyboard @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Touches/resources/CyanSquare.png b/TouchesGesture/resources/CyanSquare.png similarity index 100% rename from Touches/resources/CyanSquare.png rename to TouchesGesture/resources/CyanSquare.png diff --git a/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Contents.json b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..ffa15158 --- /dev/null +++ b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,80 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-Small@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-Small-40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-Small@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-Small-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Touches/resources/Icon-60@2x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png similarity index 100% rename from Touches/resources/Icon-60@2x.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png diff --git a/Touches/resources/Icon-60@3x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png similarity index 100% rename from Touches/resources/Icon-60@3x.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png diff --git a/Touches/resources/Icon-76.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-76.png similarity index 100% rename from Touches/resources/Icon-76.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-76.png diff --git a/Touches/resources/Icon-76@2x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png similarity index 100% rename from Touches/resources/Icon-76@2x.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png diff --git a/Touches/resources/Icon-Small-40.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png similarity index 100% rename from Touches/resources/Icon-Small-40.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png diff --git a/Touches/resources/Icon-Small-40@2x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png similarity index 100% rename from Touches/resources/Icon-Small-40@2x.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png diff --git a/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8db82b0f3141a64b3bf46ed79f7b35b033f8a08b GIT binary patch literal 1265 zcmV>{{H^`{rv<41o`>-1qB5Z6cp|4?Fk794h|0I=jUu}Y_YMi+}zy1zrUuY zrk$OgTwGi|Jv|&89P;w=*Vos9fq^wOH6bA(%*@QVxVU9yWmZ;JCnqOFL`2lo)OmS% z;^N|zl$45!igR;wPft%uN=hy+F457^tE;QU#l^eS@R1VU83Kgw@3tP zL*2Lbh#<{~4r!YfzL7`$R(&`jLEARn_zn|??EyPZ55Q@gnG;Tl0>90$j6Is9t!B=; zMGM)D*I2i^oSm@633uE=v!%)v`f2Ki2Kqm~!#mn$_gi=3d6Vv~pKT-Ve$_gCO#&)O zaKC6=c?}n?rX)!Tp=2(9Tj&_{LPmaSGB0>@oK3ex zl!9Pm(`r?k9tk=*T00pUMWT`o_XYnzips#f6NXN&41`iQttUd`j)9*>F7)56<#WHF zemxMy)Q+>n_;OuZ7h2+|o`?+8l{_N6?`T6MGs_e~sYn~H_}Wx5A&L(G?mN6HB%7?+;OfN}lgKN6$c$4S)2NVF z3taV9>_Yv{X_Hh{!yyxw5y$bZw;z`kuKQKW6At^N*gtO74r=1O+hENZ*A*2^kK2K< zCPLTBnyq<95i}XW3Je6cDBOeBIv`PBzJNG!I=Orr<$6fy8p1+?i8!H~l$e0&PfBe=!rD4Ocpr{mm2Hd4|do0ltgdL9%GqJpZb zYq1csD73ugYSS^-=A-_Eh;hci(5aPZ07Z+GAPknrEIan69x<-bCTdN*0{G-G%x%j{ z>Uq5Ay(cFJq7rXlbFe1TAl8bK9v8v}qL=kVrQpC$88zhb>K`HiRXp-8 z%xjE1D-!Y<4)K^Ztc#w7)7CLJ6;vLi`dq$ b{6P5wwaqeBVo@5300000NkvXXu0mjfi;7)= literal 0 HcmV?d00001 diff --git a/Touches/resources/Icon-Small-40@3x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png similarity index 100% rename from Touches/resources/Icon-Small-40@3x.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png diff --git a/Touches/resources/Icon-Small.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small.png similarity index 100% rename from Touches/resources/Icon-Small.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small.png diff --git a/Touches/resources/Icon-Small@2x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png similarity index 100% rename from Touches/resources/Icon-Small@2x.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x-1.png diff --git a/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9e15654654729c281785c168030047cdad2484 GIT binary patch literal 942 zcmV;f15x~mP)B{{H*>`}z6#3JMDG@$ul`;Am)Q7Z(@x_4UWc$4W{{uCA`AsHi|d zKrAdQQc_Y!M@Q@H>(9^6wY9Z2Ha0OaG1S!5j*gCohK3Rn65HF`z`($}ySpVNB_19g z<>lp~qN13Xm~?b>eSLjiUS3&QSz=;h1hx)C0008zNklbBe42Eqm#_T(U z?0eGo{on8WG7T`p(v)*oX9ml*KFboa0{c77F#ZQ#itVChET|(-7qNg={OT{VD%hR# z9l9k}bIz-!@eO&oUl^y%34FGYt&eIMDFjmnI%9bf(&$&^Ji6i4J7&=7-z?9NN!xMuldV@9C{>Cj+YMZ91?Ml<)$)5ed3YHx>4C#jMB}wkC zu{i%O9WME+g<&g7?%*QLk!$B=2>q6^U2o{rbF6=8RS}#uV;O{&b^RHm370)pk1-Ej zcjlNGQ)EtxomKmG57714&nZ?^Kzl4jxJP1fBPNV~ev=kuf@~;Di;x@kgBcUm2$>^0 zL$>P%-4UdP8g2F0qm_L5MPXOG@v+YHmSgJ3tL~)9H|r z$vP~n0#i-g59R7ivu8MKHfb@8FT!wvLijCMLGR|8PP|ye>65gCFSdE_vCpG!|QZi_AZTt^_+aGLi&L-OruZ`BJO Q$^ZZW07*qoM6N<$f`wPa;Q#;t literal 0 HcmV?d00001 diff --git a/Touches/resources/Icon-Small@3x.png b/TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png similarity index 100% rename from Touches/resources/Icon-Small@3x.png rename to TouchesGesture/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png diff --git a/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Contents.json b/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 00000000..5379aae6 --- /dev/null +++ b/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,57 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default@2x~iphone.png", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "subtype" : "retina4", + "filename" : "Default-568h@2x~iphone.png", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Portrait~ipad.png", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Landscape~ipad.png", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Portrait@2x~ipad.png", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "filename" : "Default-Landscape@2x~ipad.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Touches/resources/Default-568h@2x~iphone.png b/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png similarity index 100% rename from Touches/resources/Default-568h@2x~iphone.png rename to TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-568h@2x~iphone.png diff --git a/Touches/resources/Default-Landscape@2x~ipad.png b/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png similarity index 100% rename from Touches/resources/Default-Landscape@2x~ipad.png rename to TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png diff --git a/Touches/resources/Default-Landscape~ipad.png b/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png similarity index 100% rename from Touches/resources/Default-Landscape~ipad.png rename to TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape~ipad.png diff --git a/Touches/resources/Default-Portrait@2x~ipad.png b/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png similarity index 100% rename from Touches/resources/Default-Portrait@2x~ipad.png rename to TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait@2x~ipad.png diff --git a/Touches/resources/Default-Portrait~ipad.png b/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png similarity index 100% rename from Touches/resources/Default-Portrait~ipad.png rename to TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default-Portrait~ipad.png diff --git a/Touches/resources/Default@2x~iphone.png b/TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png similarity index 100% rename from Touches/resources/Default@2x~iphone.png rename to TouchesGesture/resources/Images.xcassets/LaunchImage.launchimage/Default@2x~iphone.png diff --git a/Touches/resources/MagentaSquare.png b/TouchesGesture/resources/MagentaSquare.png similarity index 100% rename from Touches/resources/MagentaSquare.png rename to TouchesGesture/resources/MagentaSquare.png diff --git a/Touches/resources/YellowSquare.png b/TouchesGesture/resources/YellowSquare.png similarity index 100% rename from Touches/resources/YellowSquare.png rename to TouchesGesture/resources/YellowSquare.png diff --git a/TouchesGesture/robovm.properties b/TouchesGesture/robovm.properties new file mode 100644 index 00000000..895bcc86 --- /dev/null +++ b/TouchesGesture/robovm.properties @@ -0,0 +1,6 @@ +app.version=1.0 +app.id=org.robovm.samples.touchesgesture +app.mainclass=org.robovm.samples.touchesgesture.TouchesGesture +app.executable=TouchesGesture +app.build=1 +app.name=TouchesGesture \ No newline at end of file diff --git a/Touches/robovm.xml b/TouchesGesture/robovm.xml similarity index 100% rename from Touches/robovm.xml rename to TouchesGesture/robovm.xml index 73876651..1260caf4 100644 --- a/Touches/robovm.xml +++ b/TouchesGesture/robovm.xml @@ -3,11 +3,11 @@ ${app.mainclass} ios thumbv7 + ios + Info.plist.xml resources - ios - Info.plist.xml \ No newline at end of file diff --git a/TouchesGesture/src/main/java/org/robovm/samples/touchesgesture/TouchesGesture.java b/TouchesGesture/src/main/java/org/robovm/samples/touchesgesture/TouchesGesture.java new file mode 100644 index 00000000..55aafb37 --- /dev/null +++ b/TouchesGesture/src/main/java/org/robovm/samples/touchesgesture/TouchesGesture.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2013-2015 RoboVM AB + * + * 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. + * + * Portions of this code is based on Apple Inc's Touches sample (v2.0) + * which is copyright (C) 2008-2013 Apple Inc. + */ +package org.robovm.samples.touchesgesture; + +import org.robovm.apple.foundation.NSAutoreleasePool; +import org.robovm.apple.uikit.UIApplication; +import org.robovm.apple.uikit.UIApplicationDelegateAdapter; +import org.robovm.apple.uikit.UIApplicationLaunchOptions; + +public class TouchesGesture extends UIApplicationDelegateAdapter { + + @Override + public boolean didFinishLaunching(UIApplication application, UIApplicationLaunchOptions launchOptions) { + return true; + } + + public static void main(String[] args) { + try (NSAutoreleasePool pool = new NSAutoreleasePool()) { + UIApplication.main(args, null, TouchesGesture.class); + } + } +} diff --git a/TouchesGesture/src/main/java/org/robovm/samples/touchesgesture/ui/APLViewController.java b/TouchesGesture/src/main/java/org/robovm/samples/touchesgesture/ui/APLViewController.java new file mode 100644 index 00000000..a7570a7c --- /dev/null +++ b/TouchesGesture/src/main/java/org/robovm/samples/touchesgesture/ui/APLViewController.java @@ -0,0 +1,249 @@ +/* + * Copyright (C) 2013-2015 RoboVM AB + * + * 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. + * + * Portions of this code is based on Apple Inc's Touches sample (v2.0) + * which is copyright (C) 2008-2013 Apple Inc. + */ +package org.robovm.samples.touchesgesture.ui; + +import org.robovm.apple.coregraphics.CGAffineTransform; +import org.robovm.apple.coregraphics.CGPoint; +import org.robovm.apple.coregraphics.CGRect; +import org.robovm.apple.foundation.NSArray; +import org.robovm.apple.uikit.UIGestureRecognizer; +import org.robovm.apple.uikit.UIGestureRecognizerDelegate; +import org.robovm.apple.uikit.UIGestureRecognizerState; +import org.robovm.apple.uikit.UIImageView; +import org.robovm.apple.uikit.UILongPressGestureRecognizer; +import org.robovm.apple.uikit.UIMenuController; +import org.robovm.apple.uikit.UIMenuItem; +import org.robovm.apple.uikit.UIMenuItem.OnActionListener; +import org.robovm.apple.uikit.UIPanGestureRecognizer; +import org.robovm.apple.uikit.UIPinchGestureRecognizer; +import org.robovm.apple.uikit.UIRotationGestureRecognizer; +import org.robovm.apple.uikit.UITouch; +import org.robovm.apple.uikit.UIView; +import org.robovm.apple.uikit.UIViewController; +import org.robovm.objc.annotation.CustomClass; +import org.robovm.objc.annotation.IBAction; +import org.robovm.objc.annotation.IBOutlet; + +@CustomClass("APLViewController") +public class APLViewController extends UIViewController implements UIGestureRecognizerDelegate { + private UIImageView firstPieceView; + private UIImageView secondPieceView; + private UIImageView thirdPieceView; + + private UIView pieceForReset; + + /** + * Scale and rotation transforms are applied relative to the layer's anchor + * point this method moves a gesture recognizer's view's anchor point + * between the user's fingers. + */ + private void adjustAnchorPointForGestureRecognizer(UIGestureRecognizer gestureRecognizer) { + if (gestureRecognizer.getState() == UIGestureRecognizerState.Began) { + UIView piece = gestureRecognizer.getView(); + CGPoint locationInView = gestureRecognizer.getLocationInView(piece); + CGPoint locationInSuperview = gestureRecognizer.getLocationInView(piece.getSuperview()); + + piece.getLayer().setAnchorPoint( + new CGPoint(locationInView.getX() / piece.getBounds().getSize().getWidth(), locationInView.getY() + / piece.getBounds().getSize().getHeight())); + piece.setCenter(locationInSuperview); + } + } + + /** + * Display a menu with a single item to allow the piece's transform to be + * reset. + */ + @IBAction + private void showResetMenu(UILongPressGestureRecognizer gestureRecognizer) { + if (gestureRecognizer.getState() == UIGestureRecognizerState.Began) { + becomeFirstResponder(); + pieceForReset = gestureRecognizer.getView(); + + /* + * Set up the reset menu. + */ + String menuItemTitle = "Reset"; + UIMenuItem resetMenuItem = new UIMenuItem(menuItemTitle, new OnActionListener() { + @Override + public void onAction(UIMenuController menuController, UIMenuItem menuItem) { + resetPiece(menuController); + } + }); + + UIMenuController menuController = UIMenuController.getSharedMenuController(); + menuController.setMenuItems(new NSArray(resetMenuItem)); + + CGPoint location = gestureRecognizer.getLocationInView(gestureRecognizer.getView()); + CGRect menuLocation = new CGRect(location.getX(), location.getY(), 0, 0); + menuController.setTargetRect(menuLocation, gestureRecognizer.getView()); + + menuController.setMenuVisible(true, true); + } + } + + /** + * Animate back to the default anchor point and transform. + */ + private void resetPiece(UIMenuController controller) { + CGPoint centerPoint = new CGPoint(pieceForReset.getBounds().getMidX(), pieceForReset.getBounds().getMidY()); + CGPoint locationInSuperview = pieceForReset.convertPointToView(centerPoint, pieceForReset.getSuperview()); + + pieceForReset.getLayer().setAnchorPoint(new CGPoint(0.5, 0.5)); + pieceForReset.setCenter(locationInSuperview); + + UIView.beginAnimations(null, null); + pieceForReset.setTransform(CGAffineTransform.Identity()); + UIView.commitAnimations(); + } + + /** + * UIMenuController requires that we can become first responder or it won't + * display + */ + @Override + public boolean canBecomeFirstResponder() { + return true; + } + + /** + * Shift the piece's center by the pan amount. Reset the gesture + * recognizer's translation to {0, 0} after applying so the next callback is + * a delta from the current position. + */ + @IBAction + private void panPiece(UIPanGestureRecognizer gestureRecognizer) { + UIView piece = gestureRecognizer.getView(); + + adjustAnchorPointForGestureRecognizer(gestureRecognizer); + + if (gestureRecognizer.getState() == UIGestureRecognizerState.Began + || gestureRecognizer.getState() == UIGestureRecognizerState.Changed) { + CGPoint translation = gestureRecognizer.getTranslation(piece.getSuperview()); + + piece.setCenter(new CGPoint(piece.getCenter().getX() + translation.getX(), piece.getCenter().getY() + + translation.getY())); + gestureRecognizer.setTranslation(CGPoint.Zero(), piece.getSuperview()); + } + } + + /** + * Rotate the piece by the current rotation. Reset the gesture recognizer's + * rotation to 0 after applying so the next callback is a delta from the + * current rotation. + */ + @IBAction + private void rotatePiece(UIRotationGestureRecognizer gestureRecognizer) { + adjustAnchorPointForGestureRecognizer(gestureRecognizer); + + if (gestureRecognizer.getState() == UIGestureRecognizerState.Began + || gestureRecognizer.getState() == UIGestureRecognizerState.Changed) { + gestureRecognizer.getView().setTransform( + gestureRecognizer.getView().getTransform().rotate(gestureRecognizer.getRotation())); + gestureRecognizer.setRotation(0); + } + } + + /** + * Scale the piece by the current scale. Reset the gesture recognizer's + * scale to 1 after applying so the next callback is a delta from the + * current scale. + */ + @IBAction + private void scalePiece(UIPinchGestureRecognizer gestureRecognizer) { + adjustAnchorPointForGestureRecognizer(gestureRecognizer); + + if (gestureRecognizer.getState() == UIGestureRecognizerState.Began + || gestureRecognizer.getState() == UIGestureRecognizerState.Changed) { + gestureRecognizer.getView().setTransform( + gestureRecognizer.getView().getTransform() + .scale(gestureRecognizer.getScale(), gestureRecognizer.getScale())); + gestureRecognizer.setScale(1); + } + } + + /** + * Ensure that the pinch, pan and rotate gesture recognizers on a particular + * view can all recognize simultaneously. Prevent other gesture recognizers + * from recognizing simultaneously. + */ + @Override + public boolean shouldRecognizeSimultaneously(UIGestureRecognizer gestureRecognizer, + UIGestureRecognizer otherGestureRecognizer) { + // If the gesture recognizers's view isn't one of our pieces, don't + // allow simultaneous recognition. + + if (gestureRecognizer.getView() != firstPieceView && gestureRecognizer.getView() != secondPieceView + && gestureRecognizer.getView() != thirdPieceView) { + return false; + } + + // If the gesture recognizers are on different views, don't allow + // simultaneous recognition. + if (gestureRecognizer.getView() != otherGestureRecognizer.getView()) { + return false; + } + + // If either of the gesture recognizers is the long press, don't allow + // simultaneous recognition. + if (gestureRecognizer instanceof UILongPressGestureRecognizer + || otherGestureRecognizer instanceof UILongPressGestureRecognizer) { + return false; + } + + return true; + } + + @IBOutlet + private void setFirstPieceView(UIImageView firstPieceView) { + this.firstPieceView = firstPieceView; + } + + @IBOutlet + private void setSecondPieceView(UIImageView secondPieceView) { + this.secondPieceView = secondPieceView; + } + + @IBOutlet + private void setThirdPieceView(UIImageView thirdPieceView) { + this.thirdPieceView = thirdPieceView; + } + + @Override + public boolean shouldBegin(UIGestureRecognizer gestureRecognizer) { + return true; + } + + @Override + public boolean shouldRequireFailure(UIGestureRecognizer gestureRecognizer, + UIGestureRecognizer otherGestureRecognizer) { + return false; + } + + @Override + public boolean shouldBeRequiredToFail(UIGestureRecognizer gestureRecognizer, + UIGestureRecognizer otherGestureRecognizer) { + return false; + } + + @Override + public boolean shouldReceiveTouch(UIGestureRecognizer gestureRecognizer, UITouch touch) { + return true; + } +} diff --git a/TouchesResponder/Info.plist.xml b/TouchesResponder/Info.plist.xml new file mode 100644 index 00000000..8fad5307 --- /dev/null +++ b/TouchesResponder/Info.plist.xml @@ -0,0 +1,54 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${app.name} + CFBundleExecutable + ${app.executable} + CFBundleIdentifier + ${app.id} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${app.name} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${app.version} + CFBundleSignature + ???? + CFBundleVersion + ${app.build} + LSRequiresIPhoneOS + + UIMainStoryboardFile + Main + MinimumOSVersion + 8.0 + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/TouchesResponder/build.gradle b/TouchesResponder/build.gradle new file mode 100644 index 00000000..822ffc5f --- /dev/null +++ b/TouchesResponder/build.gradle @@ -0,0 +1,3 @@ +ext { + mainClassName = "org.robovm.samples.touchesresponder.TouchesResponder" +} \ No newline at end of file diff --git a/TouchesResponder/pom.xml b/TouchesResponder/pom.xml new file mode 100644 index 00000000..f2d803ff --- /dev/null +++ b/TouchesResponder/pom.xml @@ -0,0 +1,32 @@ + + + + 4.0.0 + + + org.robovm + robovm-samples-parent + 1.0 + + + robovm-samples-touchesresponder + RoboVM port of Apple's Touches sample + + jar + + + src/main/java + + + + + org.robovm + robovm-rt + + + org.robovm + robovm-cocoatouch + + + \ No newline at end of file diff --git a/TouchesResponder/resources/Base.lproj/Main.storyboard b/TouchesResponder/resources/Base.lproj/Main.storyboard new file mode 100644 index 00000000..0ebae0e6 --- /dev/null +++ b/TouchesResponder/resources/Base.lproj/Main.storyboard @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TouchesResponder/resources/CyanSquare.png b/TouchesResponder/resources/CyanSquare.png new file mode 100644 index 0000000000000000000000000000000000000000..6d0efb7003185af21a1be5cb715912f68e285616 GIT binary patch literal 6426 zcmV+#8Rh1QP)Ng);&+%@V9^co%?}Zs?j6jml<+>Cw#s0W_qy3Z9iKHRkg)a=w zlXEN!EZ+t*AcP(SM`gfZM1ASLiKW>Lu)&ZQ_aB2Ou}bK|koWPA_xB8%7$bufDn01L zQ3=v(*3bP3DIh##SIiQ^h3?gJfX|i1rDSXvf$=PuMt#f(q?c?{W~BttE2wl{81jwF zN$p~T$c^Za_lvVgNfPE1sVNr|CXxIA8LdKQ)MFaaJ4qoR6boEvDZ-}`f@?-0J_TlX zAG}6Av3yoWygFmv?}onhTta1z(l?Nh!NsO`(1@OMdKD(1o%sG*iBrVvA&h`kV^GO} z;7dE63`LO!(|3fYnIu;nS;q63MRUn0%x7a@MaT?vj8MW?dU9jT>%Ft6EPiibqwfks zcve}c7}7YX;-qBB?+sN#geHYa$nq|dqJX9b0Er5#51`UE;jw*SqU+H~Hz0my_>cqB zQ|$$;4D2|O#)!8#(FV3K;l1ITe6EaQf5%iAf^O+P^+&#O!;m+W^ux=jN3p!9Jq+H| zeqa!~Fy=vxG3DIC3{V3p>Jp-wvT+3$__2rd56$qMRNzL!u#r1hRW+<9$Bd*>k*azs zpBoGaGgzglz4R#_c?{aJ;W=)W-xnY`p`mpa9aq(qx{tYWhu&N|%0DTq+Z^zTB>pukc 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 literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png b/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..02186449a098066280fb9e2937fec9619e7ce44e GIT binary patch literal 2294 zcmV0{{R3FC5Sl0001TP)t-s00030 z|Nj920sQ>@`uh3=1Ox*E1OER0K|w(Y2?-$~Au1{=85tS%_4VD|-L0*y5fKqfOG`8~ zG`+pOk&%(Kw6xUJ)S8-_gr%%U{h05baZs@@9)me&V7A- zp`oFsrlwf{iRl0U2tP?gK~#9!?AmLSnlKc`@$;OM3wIR}QSq{F`~AOSA=eZ`P|4nQt)C^O28CtbL$~0BjGlwTLv;a0S1t(+LA;&sE z8PyPljR|Zu*}r$nwS2#?@e98wucpAZ89=+fdVYvvan!8yoQ2>N&C-OKQ{3=Y=G$_BLw57x=DU10aIdxqjPNEik71RJ`HyG&m=FLKOUn-3T^ zT7NZ&B(NN!hsYHlvF!&*6nQk}@&dA(0LtlC|YPo6fz#L*&mD6#lGr|oT2< zUYQlNQ_2jLIsC3BBi%)DJ+R;^noh=)G~VH$aJdbq=>&m)$y4H~T=5PHzAQ@O+qJ2{ z`epTUBAIdL(gUSGVTtm?pzxi{G_Do`e}XgV`?-(*;^_|F-QkxVgl$M0X4dp=5N465 z#1p_45MWStAnq?d!NS{A$H<1x5DaIrO|?!cdAR(GY5w^eS&V`~po&6a6wIQ@h$lJ3 zAI_2N$ZHk$WF|PnAD5NKbj`j04eg;YLke3m6HM6TS>*q6#I5Nv%Y^;wzr>hy4Z-NF z#pnb@O#J+hP#~i~B1$O%tosx@O4gEj8ukq`26RtyxJCg5n`dW?X?cYGBj_=#9P9PB z_fwQ+zm5Yhz7PFUXm73+9Pe;W;< z!71ee%{jC)FyV_NOR}t-*iDnVONOUeeLPfI%I<-fD~|weDs>ZP`VyI7bKj127NbdK zfvAi00;+5+x%OvGOBQ^p&=t6AcRk7B z6{BF*!5pcW8lz6nePiy*A!Ky7qj3e-K+k>b>HQ9>e&}w8&QvI6U*jj|CbY|c!gXI6 z?uyygzre}k63TpJlBJzi9v=miS!rGs8R`nz$)VuEzQ*IKF2!`ZYYq?WsaSbFwX!{( zCrsUqTFQ{(C-zHM=|yQF;@Uc(dHI0_@7E85U zWL}o#_5+dB2%|kWJOJ$aQ00o9oxF+a#SIEAkI;CknDAUAr1pU?pv{Cx(sGTru&~@Z zPI3-(7i>>_HwX+R3b|=m16vq}9K%Q`r9!}9O2iv5_lG#dK(vDJUKm&mYheBmGtADl zwKLK~%|-nnzpt;=;F)ttQwL%s%~mux(Ad)yqfwq$I-9+7`zjErq zU>h!}x!}L#+B8$6QY{^Ir*5BF@-vGAwv^bNVjE1_BV=gtL1)L^Ll0>C!%4OFR-W)z zUG(Qr?ToJl`sx;fwe*Lugw6ueC1h?cqr8 z=yIr7sTiaXaCDy#ZZW=>JPK}JpxJ{ZG{ca>D}xbB9(j3k71~q*S&!uUE(P3x~BT|t*SyMhodc$!IM`?uzcm2G4N3i;b-I9Vfev|OE&l6jI=o2KpFCRk(}5Oe_7Hw+S4 z==MjwnOE6llI6*M-Tc(QZT*<*%GAG}ZqU(9G0}7?G0fR}CfEj?36f4kKimza``_CJ zFUr3=9Mnd5zo5%9+ANgj;eyGj5x_9wG?Hi%^Mi*Rf`qnM#v6$Ggzf5{#Fn5*}w3-)CBy5O2?TU8S%8}5pA zZoTqN0<<()7WzhF0PX8;M1&07*qoM6N<$g5oc8v;Y7A literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png b/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40.png new file mode 100644 index 0000000000000000000000000000000000000000..868d80b9895e8df40497083759994b45c6054e96 GIT binary patch literal 689 zcmV;i0#5yjP)8`}_X>{`dFyPft%478Ztvh8r6j1qB7@=;&~8aBFL8+}zxln3yXo zEBX2P@9*!!!^3rTb!BB`R#sN=@$tUCzLS%aetv#NMn(+{4b;@sv$L~GN=h>`GxPKF z;^N}Z&(F%r%BH5KUS3{3Jv}2MBM}i1udlC;j*dV;K%SnS8n^v;0005pNkllFaxAOhU4LEvT)p8dOX>%40!dH{o9mys+ zcbvJz;*hQ^up`qXj4gw&?x$xpU@?VrlD)s*pYM&5yF z@8(|kNQGYR?upjkfG{S9e0UM!kS%<$U~M8@!9Re1kcmYYE~C>*SJ*^8unE%30Wd@6 zEJO|0K|+Y<Uwl_pY zFU0NR-ehpWUOx(=jj#r7p9#|O!@IIk9p6rpdL|UBJ)c9`gmz4zj#FmD_aW@2GL{nY*e X%t#gogpAgU00000NkvXXu0mjfv?NIT literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png b/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8db82b0f3141a64b3bf46ed79f7b35b033f8a08b GIT binary patch literal 1265 zcmV>{{H^`{rv<41o`>-1qB5Z6cp|4?Fk794h|0I=jUu}Y_YMi+}zy1zrUuY zrk$OgTwGi|Jv|&89P;w=*Vos9fq^wOH6bA(%*@QVxVU9yWmZ;JCnqOFL`2lo)OmS% z;^N|zl$45!igR;wPft%uN=hy+F457^tE;QU#l^eS@R1VU83Kgw@3tP zL*2Lbh#<{~4r!YfzL7`$R(&`jLEARn_zn|??EyPZ55Q@gnG;Tl0>90$j6Is9t!B=; zMGM)D*I2i^oSm@633uE=v!%)v`f2Ki2Kqm~!#mn$_gi=3d6Vv~pKT-Ve$_gCO#&)O zaKC6=c?}n?rX)!Tp=2(9Tj&_{LPmaSGB0>@oK3ex zl!9Pm(`r?k9tk=*T00pUMWT`o_XYnzips#f6NXN&41`iQttUd`j)9*>F7)56<#WHF zemxMy)Q+>n_;OuZ7h2+|o`?+8l{_N6?`T6MGs_e~sYn~H_}Wx5A&L(G?mN6HB%7?+;OfN}lgKN6$c$4S)2NVF z3taV9>_Yv{X_Hh{!yyxw5y$bZw;z`kuKQKW6At^N*gtO74r=1O+hENZ*A*2^kK2K< zCPLTBnyq<95i}XW3Je6cDBOeBIv`PBzJNG!I=Orr<$6fy8p1+?i8!H~l$e0&PfBe=!rD4Ocpr{mm2Hd4|do0ltgdL9%GqJpZb zYq1csD73ugYSS^-=A-_Eh;hci(5aPZ07Z+GAPknrEIan69x<-bCTdN*0{G-G%x%j{ z>Uq5Ay(cFJq7rXlbFe1TAl8bK9v8v}qL=kVrQpC$88zhb>K`HiRXp-8 z%xjE1D-!Y<4)K^Ztc#w7)7CLJ6;vLi`dq$ b{6P5wwaqeBVo@5300000NkvXXu0mjfi;7)= literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png b/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8db82b0f3141a64b3bf46ed79f7b35b033f8a08b GIT binary patch literal 1265 zcmV>{{H^`{rv<41o`>-1qB5Z6cp|4?Fk794h|0I=jUu}Y_YMi+}zy1zrUuY zrk$OgTwGi|Jv|&89P;w=*Vos9fq^wOH6bA(%*@QVxVU9yWmZ;JCnqOFL`2lo)OmS% z;^N|zl$45!igR;wPft%uN=hy+F457^tE;QU#l^eS@R1VU83Kgw@3tP zL*2Lbh#<{~4r!YfzL7`$R(&`jLEARn_zn|??EyPZ55Q@gnG;Tl0>90$j6Is9t!B=; zMGM)D*I2i^oSm@633uE=v!%)v`f2Ki2Kqm~!#mn$_gi=3d6Vv~pKT-Ve$_gCO#&)O zaKC6=c?}n?rX)!Tp=2(9Tj&_{LPmaSGB0>@oK3ex zl!9Pm(`r?k9tk=*T00pUMWT`o_XYnzips#f6NXN&41`iQttUd`j)9*>F7)56<#WHF zemxMy)Q+>n_;OuZ7h2+|o`?+8l{_N6?`T6MGs_e~sYn~H_}Wx5A&L(G?mN6HB%7?+;OfN}lgKN6$c$4S)2NVF z3taV9>_Yv{X_Hh{!yyxw5y$bZw;z`kuKQKW6At^N*gtO74r=1O+hENZ*A*2^kK2K< zCPLTBnyq<95i}XW3Je6cDBOeBIv`PBzJNG!I=Orr<$6fy8p1+?i8!H~l$e0&PfBe=!rD4Ocpr{mm2Hd4|do0ltgdL9%GqJpZb zYq1csD73ugYSS^-=A-_Eh;hci(5aPZ07Z+GAPknrEIan69x<-bCTdN*0{G-G%x%j{ z>Uq5Ay(cFJq7rXlbFe1TAl8bK9v8v}qL=kVrQpC$88zhb>K`HiRXp-8 z%xjE1D-!Y<4)K^Ztc#w7)7CLJ6;vLi`dq$ b{6P5wwaqeBVo@5300000NkvXXu0mjfi;7)= literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png b/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc6928918d1634f0e1614c8279445b6ecd3b0045 GIT binary patch literal 1721 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 Q$^ZZW07*qoM6N<$f`wPa;Q#;t literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png b/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9e15654654729c281785c168030047cdad2484 GIT binary patch literal 942 zcmV;f15x~mP)B{{H*>`}z6#3JMDG@$ul`;Am)Q7Z(@x_4UWc$4W{{uCA`AsHi|d zKrAdQQc_Y!M@Q@H>(9^6wY9Z2Ha0OaG1S!5j*gCohK3Rn65HF`z`($}ySpVNB_19g z<>lp~qN13Xm~?b>eSLjiUS3&QSz=;h1hx)C0008zNklbBe42Eqm#_T(U z?0eGo{on8WG7T`p(v)*oX9ml*KFboa0{c77F#ZQ#itVChET|(-7qNg={OT{VD%hR# z9l9k}bIz-!@eO&oUl^y%34FGYt&eIMDFjmnI%9bf(&$&^Ji6i4J7&=7-z?9NN!xMuldV@9C{>Cj+YMZ91?Ml<)$)5ed3YHx>4C#jMB}wkC zu{i%O9WME+g<&g7?%*QLk!$B=2>q6^U2o{rbF6=8RS}#uV;O{&b^RHm370)pk1-Ej zcjlNGQ)EtxomKmG57714&nZ?^Kzl4jxJP1fBPNV~ev=kuf@~;Di;x@kgBcUm2$>^0 zL$>P%-4UdP8g2F0qm_L5MPXOG@v+YHmSgJ3tL~)9H|r z$vP~n0#i-g59R7ivu8MKHfb@8FT!wvLijCMLGR|8PP|ye>65gCFSdE_vCpG!|QZi_AZTt^_+aGLi&L-OruZ`BJO Q$^ZZW07*qoM6N<$f`wPa;Q#;t literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/TouchesResponder/resources/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..8219640ceee147e785aaf0bdf805756b093037fa GIT binary patch literal 1360 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 QssHs=Q_@nbmbVW7Uy_b7>;M1& literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png b/TouchesResponder/resources/Images.xcassets/LaunchImage.launchimage/Default-Landscape@2x~ipad.png new file mode 100644 index 0000000000000000000000000000000000000000..e17e1121ae6a97d9bd847ec6b9238c853c9e33fe GIT binary patch literal 15450 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 M07*qoM6N<$g5OJ##{d8T literal 0 HcmV?d00001 diff --git a/TouchesResponder/resources/YellowSquare.png b/TouchesResponder/resources/YellowSquare.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b4818def1167fefd18dff20d8d1a9430e41e86 GIT binary patch literal 3843 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 literal 0 HcmV?d00001 diff --git a/TouchesResponder/robovm.properties b/TouchesResponder/robovm.properties new file mode 100644 index 00000000..95be49ed --- /dev/null +++ b/TouchesResponder/robovm.properties @@ -0,0 +1,6 @@ +app.version=1.0 +app.id=org.robovm.samples.touchesresponder +app.mainclass=org.robovm.samples.touchesresponder.TouchesResponder +app.executable=TouchesResponder +app.build=1 +app.name=TouchesResponder \ No newline at end of file diff --git a/TouchesResponder/robovm.xml b/TouchesResponder/robovm.xml new file mode 100644 index 00000000..1260caf4 --- /dev/null +++ b/TouchesResponder/robovm.xml @@ -0,0 +1,13 @@ + + ${app.executable} + ${app.mainclass} + ios + thumbv7 + ios + Info.plist.xml + + + resources + + + \ No newline at end of file diff --git a/TouchesResponder/src/main/java/org/robovm/samples/touchesresponder/TouchesResponder.java b/TouchesResponder/src/main/java/org/robovm/samples/touchesresponder/TouchesResponder.java new file mode 100644 index 00000000..ea51e78d --- /dev/null +++ b/TouchesResponder/src/main/java/org/robovm/samples/touchesresponder/TouchesResponder.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2013-2015 RoboVM AB + * + * 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. + * + * Portions of this code is based on Apple Inc's Touches sample (v2.0) + * which is copyright (C) 2008-2013 Apple Inc. + */ +package org.robovm.samples.touchesresponder; + +import org.robovm.apple.foundation.NSAutoreleasePool; +import org.robovm.apple.uikit.UIApplication; +import org.robovm.apple.uikit.UIApplicationDelegateAdapter; +import org.robovm.apple.uikit.UIApplicationLaunchOptions; + +public class TouchesResponder extends UIApplicationDelegateAdapter { + + @Override + public boolean didFinishLaunching(UIApplication application, UIApplicationLaunchOptions launchOptions) { + return true; + } + + public static void main(String[] args) { + try (NSAutoreleasePool pool = new NSAutoreleasePool()) { + UIApplication.main(args, null, TouchesResponder.class); + } + } +} diff --git a/Touches/src/main/java/org/robovm/samples/touches/viewcontrollers/TouchViewController.java b/TouchesResponder/src/main/java/org/robovm/samples/touchesresponder/ui/APLViewController.java similarity index 50% rename from Touches/src/main/java/org/robovm/samples/touches/viewcontrollers/TouchViewController.java rename to TouchesResponder/src/main/java/org/robovm/samples/touchesresponder/ui/APLViewController.java index c6288551..3e2d526d 100644 --- a/Touches/src/main/java/org/robovm/samples/touches/viewcontrollers/TouchViewController.java +++ b/TouchesResponder/src/main/java/org/robovm/samples/touchesresponder/ui/APLViewController.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 RoboVM AB + * Copyright (C) 2013-2015 RoboVM AB * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,116 +16,71 @@ * Portions of this code is based on Apple Inc's Touches sample (v2.0) * which is copyright (C) 2008-2013 Apple Inc. */ - -package org.robovm.samples.touches.viewcontrollers; +package org.robovm.samples.touchesresponder.ui; import org.robovm.apple.coregraphics.CGAffineTransform; import org.robovm.apple.coregraphics.CGPoint; -import org.robovm.apple.coregraphics.CGRect; import org.robovm.apple.foundation.NSSet; -import org.robovm.apple.uikit.NSTextAlignment; -import org.robovm.apple.uikit.UIColor; import org.robovm.apple.uikit.UIEvent; -import org.robovm.apple.uikit.UIFont; -import org.robovm.apple.uikit.UIImage; import org.robovm.apple.uikit.UIImageView; import org.robovm.apple.uikit.UILabel; import org.robovm.apple.uikit.UITouch; import org.robovm.apple.uikit.UIView; import org.robovm.apple.uikit.UIViewController; +import org.robovm.objc.annotation.CustomClass; +import org.robovm.objc.annotation.IBOutlet; -public class TouchViewController extends UIViewController { - private boolean piecesOnTop; // Keeps track of whether two or more pieces are on top of each other. - - // Views the user can move - private final UIImageView firstPieceView; - private final UIImageView secondPieceView; - private final UIImageView thirdPieceView; - - private final UILabel touchPhaseText; // Displays the touch phase. - private final UILabel touchInfoText; // Displays touch information for multiple taps. - private final UILabel touchTrackingText; // Displays touch tracking information - private final UILabel touchInstructionsText; // Displays instructions for how to split apart pieces that are on top of each -// other. - - /** Determines how fast a piece size grows when it is moved. */ +@CustomClass("APLViewController") +public class APLViewController extends UIViewController { + // Determines how fast a piece size grows when it is moved. private static final double GROW_ANIMATION_DURATION_SECONDS = 0.15; - /** Determines how fast a piece size shrinks when a piece stops moving. */ + // Determines how fast a piece size shrinks when a piece stops moving. private static final double SHRINK_ANIMATION_DURATION_SECONDS = 0.15; - public TouchViewController () { - getTabBarItem().setTitle("Touches"); - - UIView view = getView(); - view.setBackgroundColor(UIColor.darkText()); - - firstPieceView = new UIImageView(UIImage.create("CyanSquare.png")); - firstPieceView.setFrame(new CGRect(110, 190, 100, 100)); - firstPieceView.setAlpha(0.9); - view.addSubview(firstPieceView); - - secondPieceView = new UIImageView(UIImage.create("MagentaSquare.png")); - secondPieceView.setFrame(new CGRect(210, 290, 100, 100)); - secondPieceView.setAlpha(0.9); - view.addSubview(secondPieceView); - - thirdPieceView = new UIImageView(UIImage.create("YellowSquare.png")); - thirdPieceView.setFrame(new CGRect(10, 90, 100, 100)); - thirdPieceView.setAlpha(0.9); - view.addSubview(thirdPieceView); + private boolean piecesOnTop;// Keeps track of whether two or more pieces are + // on top of each other. - touchPhaseText = new UILabel(new CGRect(34, 24, 253, 21)); - touchPhaseText.setText("\"Touches\"; lets you observe touch"); - touchPhaseText.setFont(UIFont.getSystemFont(16)); - touchPhaseText.setTextColor(UIColor.white()); - touchPhaseText.setTextAlignment(NSTextAlignment.Center); - view.addSubview(touchPhaseText); - - touchTrackingText = new UILabel(new CGRect(64, 45, 193, 21)); - touchTrackingText.setText("phases and multiple taps."); - touchTrackingText.setFont(UIFont.getSystemFont(16)); - touchTrackingText.setTextColor(UIColor.white()); - touchTrackingText.setTextAlignment(NSTextAlignment.Center); - view.addSubview(touchTrackingText); - - touchInfoText = new UILabel(new CGRect(0, 76, 320, 20)); - touchInfoText.setFont(UIFont.getSystemFont(16)); - touchInfoText.setTextColor(UIColor.white()); - touchInfoText.setTextAlignment(NSTextAlignment.Center); - view.addSubview(touchInfoText); - - touchInstructionsText = new UILabel(new CGRect(0, 448, 320, 20)); - touchInstructionsText.setFont(UIFont.getSystemFont(16)); - touchInstructionsText.setTextColor(UIColor.white()); - touchInstructionsText.setTextAlignment(NSTextAlignment.Center); - view.addSubview(touchInstructionsText); - } - - /** Handles the start of a touch. */ + // Views the user can move + private UIImageView firstPieceView; + private UIImageView secondPieceView; + private UIImageView thirdPieceView; + + // Displays the touch phase. + private UILabel touchPhaseText; + // Displays touch information for multiple taps. + private UILabel touchInfoText; + // Displays touch tracking information. + private UILabel touchTrackingText; + // Displays instructions for how to split apart pieces that are on top of + // each other. + private UILabel touchInstructionsText; + + /** + * Handles the start of a touch. + */ @Override - public void touchesBegan (NSSet touches, UIEvent event) { + public void touchesBegan(NSSet touches, UIEvent event) { long numTaps = touches.any().getTapCount(); touchPhaseText.setText("Phase: Touches began"); touchInfoText.setText(""); - if (numTaps >= 2) { touchInfoText.setText(String.format("%d taps", numTaps)); - - if (numTaps == 2 && piecesOnTop) { + if ((numTaps == 2) && piecesOnTop) { // A double tap positions the three pieces in a diagonal. - // The user will want to double tap when two or more pieces are on top of each other + // The user will want to double tap when two or more pieces are + // on top of each other if (firstPieceView.getCenter().getX() == secondPieceView.getCenter().getX()) { - secondPieceView.setCenter(new CGPoint(firstPieceView.getCenter().getX() - 50, firstPieceView.getCenter() - .getY() - 50)); + secondPieceView.setCenter(new CGPoint(firstPieceView.getCenter().getX() - 50, firstPieceView + .getCenter().getY() - 50)); } if (firstPieceView.getCenter().getX() == thirdPieceView.getCenter().getX()) { - thirdPieceView.setCenter(new CGPoint(firstPieceView.getCenter().getX() + 50, firstPieceView.getCenter() - .getY() + 50)); + thirdPieceView.setCenter(new CGPoint(firstPieceView.getCenter().getX() + 50, firstPieceView + .getCenter().getY() + 50)); } if (secondPieceView.getCenter().getX() == thirdPieceView.getCenter().getX()) { - thirdPieceView.setCenter(new CGPoint(secondPieceView.getCenter().getX() + 50, secondPieceView.getCenter() - .getY() + 50)); + thirdPieceView.setCenter(new CGPoint(secondPieceView.getCenter().getX() + 50, secondPieceView + .getCenter().getY() + 50)); } touchInstructionsText.setText(""); } @@ -135,14 +90,18 @@ public void touchesBegan (NSSet touches, UIEvent event) { // Enumerate through all the touch objects. for (UITouch touch : touches) { - // Send to the dispatch method, which will make sure the appropriate subview is acted upon. + // Send to the dispatch method, which will make sure the appropriate + // subview is acted upon. dispatchFirstTouch(touch.getLocationInView(getView()), null); } } - /** Checks to see which view, or views, the point is in and then calls a method to perform the opening animation, which makes - * the piece slightly larger, as if it is being picked up by the user. */ - private void dispatchFirstTouch (CGPoint touchPoint, UIEvent event) { + /** + * Checks to see which view, or views, the point is in and then calls a + * method to perform the opening animation, which makes the piece slightly + * larger, as if it is being picked up by the user. + */ + private void dispatchFirstTouch(CGPoint touchPoint, UIEvent event) { if (firstPieceView.getFrame().contains(touchPoint)) { animateFirstTouch(touchPoint, firstPieceView); } @@ -154,15 +113,17 @@ private void dispatchFirstTouch (CGPoint touchPoint, UIEvent event) { } } - /** Handles the continuation of a touch. */ + /** + * Handles the continuation of a touch. + */ @Override - public void touchesMoved (NSSet touches, UIEvent event) { + public void touchesMoved(NSSet touches, UIEvent event) { int touchCount = 0; touchPhaseText.setText("Phase: Touches moved"); - // Enumerates through all touch objects for (UITouch touch : touches) { - // Send to the dispatch method, which will make sure the appropriate subview is acted upon + // Send to the dispatch method, which will make sure the appropriate + // subview is acted upon dispatchTouchEvent(touch.getView(), touch.getLocationInView(getView())); touchCount++; } @@ -175,10 +136,14 @@ public void touchesMoved (NSSet touches, UIEvent event) { } } - /** Checks to see which view, or views, the point is in and then sets the center of each moved view to the new postion. If - * views are directly on top of each other, they move together. */ - private void dispatchTouchEvent (UIView view, CGPoint position) { - // Check to see which view, or views, the point is in and then move to that position. + /** + * Checks to see which view, or views, the point is in and then sets the + * center of each moved view to the new postion. If views are directly on + * top of each other, they move together. + */ + private void dispatchTouchEvent(UIView view, CGPoint position) { + // Check to see which view, or views, the point is in and then move to + // that position. if (firstPieceView.getFrame().contains(position)) { firstPieceView.setCenter(position); } @@ -190,36 +155,43 @@ private void dispatchTouchEvent (UIView view, CGPoint position) { } } - /** Handles the end of a touch event. */ + /** + * Handles the end of a touch event. + */ @Override - public void touchesEnded (NSSet touches, UIEvent event) { + public void touchesEnded(NSSet touches, UIEvent event) { touchPhaseText.setText("Phase: Touches ended"); - // Enumerates through all touch object for (UITouch touch : touches) { - // Sends to the dispatch method, which will make sure the appropriate subview is acted upon + // Sends to the dispatch method, which will make sure the + // appropriate subview is acted upon dispatchTouchEndEvent(touch.getView(), touch.getLocationInView(getView())); } } - /** Checks to see which view, or views, the point is in and then calls a method to perform the closing animation, which is to - * return the piece to its original size, as if it is being put down by the user. */ - private void dispatchTouchEndEvent (UIView view, CGPoint position) { - // Check to see which view, or views, the point is in and then animate to that position. + /** + * Checks to see which view, or views, the point is in and then calls a + * method to perform the closing animation, which is to return the piece to + * its original size, as if it is being put down by the user. + */ + private void dispatchTouchEndEvent(UIView view, CGPoint position) { + // Check to see which view, or views, the point is in and then animate + // to that position. if (firstPieceView.getFrame().contains(position)) { - animateViewToPosition(firstPieceView, position); + animateView(firstPieceView, position); } if (secondPieceView.getFrame().contains(position)) { - animateViewToPosition(secondPieceView, position); + animateView(secondPieceView, position); } if (thirdPieceView.getFrame().contains(position)) { - animateViewToPosition(thirdPieceView, position); + animateView(thirdPieceView, position); } - // If one piece obscures another, display a message so the user can move the pieces apart. - if (firstPieceView.getCenter().equalsTo(secondPieceView.getCenter()) - || firstPieceView.getCenter().equalsTo(thirdPieceView.getCenter()) - || secondPieceView.getCenter().equalsTo(thirdPieceView.getCenter())) { + // If one piece obscures another, display a message so the user can move + // the pieces apart. + if (firstPieceView.getCenter().equalsTo(secondPieceView.getCenter()) || + firstPieceView.getCenter().equalsTo(thirdPieceView.getCenter()) || + secondPieceView.getCenter().equalsTo(thirdPieceView.getCenter())) { touchInstructionsText.setText("Double tap the background to move the pieces apart."); piecesOnTop = true; } else { @@ -228,18 +200,21 @@ private void dispatchTouchEndEvent (UIView view, CGPoint position) { } @Override - public void touchesCancelled (NSSet touches, UIEvent event) { + public void touchesCancelled(NSSet touches, UIEvent event) { touchPhaseText.setText("Phase: Touches cancelled"); - // Enumerates through all touch objects. for (UITouch touch : touches) { - // Sends to the dispatch method, which will make sure the appropriate subview is acted upon. + // Sends to the dispatch method, which will make sure the + // appropriate subview is acted upon. dispatchTouchEndEvent(touch.getView(), touch.getLocationInView(getView())); } } - /** Scales up a view slightly which makes the piece slightly larger, as if it is being picked up by the user. */ - private void animateFirstTouch (CGPoint touchPoint, UIImageView view) { + /** + * Scales up a view slightly which makes the piece slightly larger, as if it + * is being picked up by the user. + */ + private void animateFirstTouch(CGPoint touchPoint, UIImageView view) { // Pulse the view by scaling up, then move the view to under the finger. UIView.beginAnimations(null, null); UIView.setAnimationDurationInSeconds(GROW_ANIMATION_DURATION_SECONDS); @@ -247,14 +222,52 @@ private void animateFirstTouch (CGPoint touchPoint, UIImageView view) { UIView.commitAnimations(); } - /** Scales down the view and moves it to the new position. */ - private void animateViewToPosition (UIView view, CGPoint position) { + /** + * Scales down the view and moves it to the new position. + */ + private void animateView(UIView view, CGPoint position) { UIView.beginAnimations(null, null); UIView.setAnimationDurationInSeconds(SHRINK_ANIMATION_DURATION_SECONDS); // Set the center to the final postion. view.setCenter(position); - // Set the transform back to the identity, thus undoing the previous scaling effect. + // Set the transform back to the identity, thus undoing the previous + // scaling effect. view.setTransform(CGAffineTransform.Identity()); UIView.commitAnimations(); } + + @IBOutlet + private void setFirstPieceView(UIImageView firstPieceView) { + this.firstPieceView = firstPieceView; + } + + @IBOutlet + private void setSecondPieceView(UIImageView secondPieceView) { + this.secondPieceView = secondPieceView; + } + + @IBOutlet + private void setThirdPieceView(UIImageView thirdPieceView) { + this.thirdPieceView = thirdPieceView; + } + + @IBOutlet + private void setTouchPhaseText(UILabel touchPhaseText) { + this.touchPhaseText = touchPhaseText; + } + + @IBOutlet + private void setTouchInfoText(UILabel touchInfoText) { + this.touchInfoText = touchInfoText; + } + + @IBOutlet + private void setTouchTrackingText(UILabel touchTrackingText) { + this.touchTrackingText = touchTrackingText; + } + + @IBOutlet + private void setTouchInstructionsText(UILabel touchInstructionsText) { + this.touchInstructionsText = touchInstructionsText; + } }