ViewControlLayer.java
Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2013 OSRF.
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
00005  * use this file except in compliance with the License. You may obtain a copy of
00006  * the License at
00007  *
00008  * http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
00012  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
00013  * License for the specific language governing permissions and limitations under
00014  * the License.
00015  */
00016 
00017 package com.github.rosjava.android_apps.make_a_map;
00018 
00019 
00020 
00021 import java.util.concurrent.ExecutorService;
00022 import android.content.Context;
00023 import android.view.GestureDetector;
00024 import android.view.MotionEvent;
00025 import android.view.ScaleGestureDetector;
00026 import android.view.View;
00027 import android.view.ViewGroup;
00028 
00029 import com.github.rosjava.android_remocons.common_tools.apps.AppParameters;
00030 
00031 import org.ros.android.view.RosImageView;
00032 import org.ros.android.view.visualization.RotateGestureDetector;
00033 import org.ros.android.view.visualization.VisualizationView;
00034 import org.ros.android.view.visualization.layer.CameraControlLayer;
00035 import org.ros.android.view.visualization.layer.CameraControlListener;
00036 import org.ros.concurrent.ListenerGroup;
00037 import org.ros.concurrent.SignalRunnable;
00038 import org.ros.node.ConnectedNode;
00039 
00043 public class ViewControlLayer extends CameraControlLayer {
00044 
00045     private final Context context;
00046     private final ListenerGroup<CameraControlListener> listeners;
00047 
00048     private GestureDetector translateGestureDetector;
00049     private RotateGestureDetector rotateGestureDetector;
00050     private ScaleGestureDetector zoomGestureDetector;
00051 
00052     private RosImageView<sensor_msgs.CompressedImage> cameraView;
00053     private VisualizationView mapView;
00054     private ViewGroup mainLayout;
00055     private ViewGroup sideLayout;
00056     private boolean mapViewGestureAvaiable;
00057 
00058 
00059     private enum ViewMode {
00060         CAMERA, MAP
00061     };
00062     private ViewMode viewMode;
00063     private String robotFrame;
00064 
00065 
00066     public ViewControlLayer(final Context context,
00067                             final ExecutorService executorService,
00068                             final RosImageView<sensor_msgs.CompressedImage> cameraView,
00069                             final VisualizationView mapView,
00070                             final ViewGroup mainLayout,
00071                             final ViewGroup sideLayout,
00072                             final AppParameters params) {
00073 
00074         this.context = context;
00075 
00076         listeners = new ListenerGroup<CameraControlListener>(executorService);
00077 
00078         this.cameraView = cameraView;
00079         this.mapView = mapView;
00080         this.mainLayout = mainLayout;
00081         this.sideLayout = sideLayout;
00082 
00083         viewMode = ViewMode.CAMERA;
00084         this.cameraView.setOnClickListener(new View.OnClickListener() {
00085             @Override
00086             public void onClick(View v){
00087                 swapViews();
00088             }
00089         });
00090 
00091         this.mapView.setClickable(true);
00092         this.cameraView.setClickable(false);
00093         this.robotFrame = (String) params.get("robot_frame", context.getString(R.string.robot_frame));
00094         mapViewGestureAvaiable = false;
00095     }
00096 
00097 
00098     @Override
00099     public boolean onTouchEvent(VisualizationView view,MotionEvent event){
00100 
00101         if(event.getAction()==MotionEvent.ACTION_UP){
00102             mapViewGestureAvaiable = true;
00103         }
00104         if(viewMode == ViewMode.CAMERA){
00105             swapViews();
00106             return true;
00107         }
00108         else {
00109             if (translateGestureDetector == null || rotateGestureDetector == null
00110                     || zoomGestureDetector == null) {
00111                 return false;
00112             }
00113             return translateGestureDetector.onTouchEvent(event)
00114                     || rotateGestureDetector.onTouchEvent(event) || zoomGestureDetector.onTouchEvent(event);
00115         }
00116     }
00117 
00118 
00119 
00123     private void swapViews() {
00124         // Figure out where the views were...
00125         ViewGroup mapViewParent;
00126         ViewGroup cameraViewParent;
00127 
00128         if (viewMode == ViewMode.CAMERA) {
00129 
00130             mapViewParent = sideLayout;
00131             cameraViewParent = mainLayout;
00132         } else {
00133 
00134             mapViewParent = mainLayout;
00135             cameraViewParent = sideLayout;
00136         }
00137         int mapViewIndex = mapViewParent.indexOfChild(mapView);
00138         int cameraViewIndex = cameraViewParent.indexOfChild(cameraView);
00139 
00140         // Remove the views from their old locations...
00141         mapViewParent.removeView(mapView);
00142         cameraViewParent.removeView(cameraView);
00143 
00144         // Add them to their new location...
00145         mapViewParent.addView(cameraView, mapViewIndex);
00146         cameraViewParent.addView(mapView , cameraViewIndex);
00147 
00148         // Remeber that we are in the other mode now.
00149         if (viewMode == ViewMode.CAMERA) {
00150             viewMode = ViewMode.MAP;
00151             mapViewGestureAvaiable = false;
00152         } else {
00153             viewMode = ViewMode.CAMERA;
00154         }
00155         mapView.getCamera().jumpToFrame(robotFrame);
00156         mapView.setClickable(viewMode != ViewMode.MAP);
00157         cameraView.setClickable(viewMode != ViewMode.CAMERA);
00158 
00159     }
00160 
00161     @Override
00162     public void onStart(final VisualizationView view, ConnectedNode connectedNode) {
00163         view.post(new Runnable() {
00164             @Override
00165             public void run() {
00166                 translateGestureDetector =
00167                         new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
00168                             @Override
00169                             public boolean onScroll(MotionEvent event1, MotionEvent event2,
00170                                                     final float distanceX, final float distanceY) {
00171                                 if (mapViewGestureAvaiable) {
00172                                     view.getCamera().translate(-distanceX, distanceY);
00173                                     listeners.signal(new SignalRunnable<CameraControlListener>() {
00174                                         @Override
00175                                         public void run(CameraControlListener listener) {
00176                                             listener.onTranslate(-distanceX, distanceY);
00177                                         }
00178                                     });
00179                                     return true;
00180                                 }
00181 
00182                                 return false;
00183                             }
00184                         });
00185                 rotateGestureDetector =
00186                         new RotateGestureDetector(new RotateGestureDetector.OnRotateGestureListener() {
00187                             @Override
00188                             public boolean onRotate(MotionEvent event1, MotionEvent event2,
00189                                                     final double deltaAngle) {
00190                                 if (mapViewGestureAvaiable) {
00191                                     final float focusX = (event1.getX(0) + event1.getX(1)) / 2;
00192                                     final float focusY = (event1.getY(0) + event1.getY(1)) / 2;
00193                                     view.getCamera().rotate(focusX, focusY, deltaAngle);
00194                                     listeners.signal(new SignalRunnable<CameraControlListener>() {
00195                                         @Override
00196                                         public void run(CameraControlListener listener) {
00197                                             listener.onRotate(focusX, focusY, deltaAngle);
00198                                         }
00199                                     });
00200                                     // Don't consume this event in order to allow the zoom gesture
00201                                     // to also be detected.
00202                                     return false;
00203                                 }
00204 
00205                                 return true;
00206                             }
00207                         });
00208                 zoomGestureDetector =
00209                         new ScaleGestureDetector(context,
00210                                 new ScaleGestureDetector.SimpleOnScaleGestureListener() {
00211                                     @Override
00212                                     public boolean onScale(ScaleGestureDetector detector) {
00213                                         if (!detector.isInProgress()) {
00214                                             return false;
00215                                         }
00216                                         if (mapViewGestureAvaiable) {
00217                                             final float focusX = detector.getFocusX();
00218                                             final float focusY = detector.getFocusY();
00219                                             final float factor = detector.getScaleFactor();
00220                                             view.getCamera().zoom(focusX, focusY, factor);
00221                                             listeners.signal(new SignalRunnable<CameraControlListener>() {
00222                                                 @Override
00223                                                 public void run(CameraControlListener listener) {
00224                                                     listener.onZoom(focusX, focusY, factor);
00225                                                 }
00226                                             });
00227                                             return true;
00228                                         }
00229 
00230                                         return false;
00231                                     }
00232                                 });
00233             }
00234         });
00235     }
00236 }


android_apps
Author(s): Daniel Stonier , Kazuto Murase
autogenerated on Thu Jun 6 2019 21:11:28