1 package osg.AndroidExample; 2 3 import android.app.Activity; 4 import android.app.AlertDialog; 5 import android.content.Context; 6 import android.content.DialogInterface; 7 import android.content.res.Resources; 8 import android.graphics.Color; 9 import android.graphics.PointF; 10 import android.os.Bundle; 11 import android.util.FloatMath; 12 import android.util.Log; 13 import android.view.KeyEvent; 14 import android.view.LayoutInflater; 15 import android.view.MenuItem; 16 import android.view.MotionEvent; 17 import android.view.View; 18 import android.view.Menu; 19 import android.view.MenuInflater; 20 import android.view.WindowManager; 21 import android.view.View.OnClickListener; 22 import android.view.inputmethod.InputMethodManager; 23 import android.widget.Button; 24 import android.widget.EditText; 25 import android.widget.TextView; 26 import android.widget.Toast; 27 import android.widget.ImageButton; 28 29 import java.io.File; 30 31 public class osgViewer extends Activity implements View.OnTouchListener, View.OnKeyListener 32 { 33 enum moveTypes { NONE , DRAG, MDRAG, ZOOM ,ACTUALIZE} 34 enum navType { PRINCIPAL , SECONDARY } 35 enum lightType { ON , OFF } 36 37 moveTypes mode=moveTypes.NONE; 38 navType navMode = navType.PRINCIPAL; 39 lightType lightMode = lightType.ON; 40 41 PointF oneFingerOrigin = new PointF(0,0); 42 long timeOneFinger=0; 43 PointF twoFingerOrigin = new PointF(0,0); 44 long timeTwoFinger=0; 45 float distanceOrigin; 46 47 private static final String TAG = "OSG Activity"; 48 //Ui elements 49 EGLview mView; 50 Button uiCenterViewButton; 51 52 //Dialogs 53 AlertDialog removeLayerDialog; 54 AlertDialog loadLayerAddress; 55 56 //Main Android Activity life cycle onCreate(Bundle icicle)57 @Override protected void onCreate(Bundle icicle) 58 { 59 super.onCreate(icicle); 60 setContentView(R.layout.ui_layout_gles); 61 62 // get the gl view and attach touch listeners 63 mView= (EGLview) findViewById(R.id.surfaceGLES); 64 mView.setOnTouchListener(this); 65 mView.setOnKeyListener(this); 66 67 uiCenterViewButton = (Button) findViewById(R.id.uiButtonCenter); 68 uiCenterViewButton.setOnClickListener(uiListenerCenterView); 69 } 70 onPause()71 @Override protected void onPause() { 72 super.onPause(); 73 mView.onPause(); 74 } onResume()75 @Override protected void onResume() { 76 super.onResume(); 77 mView.onResume(); 78 } 79 80 //Main view event processing 81 @Override onKey(View v, int keyCode, KeyEvent event)82 public boolean onKey(View v, int keyCode, KeyEvent event) { 83 84 return true; 85 } 86 @Override onKeyDown(int keyCode, KeyEvent event)87 public boolean onKeyDown(int keyCode, KeyEvent event){ 88 //DO NOTHING this will render useless every menu key except Home 89 int keyChar= event.getUnicodeChar(); 90 osgNativeLib.keyboardDown(keyChar); 91 return true; 92 } 93 @Override onKeyUp(int keyCode, KeyEvent event)94 public boolean onKeyUp(int keyCode, KeyEvent event){ 95 switch (keyCode){ 96 case KeyEvent.KEYCODE_BACK: 97 super.onDestroy(); 98 this.finish(); 99 break; 100 case KeyEvent.KEYCODE_SEARCH: 101 break; 102 case KeyEvent.KEYCODE_MENU: 103 this.openOptionsMenu(); 104 break; 105 default: 106 int keyChar= event.getUnicodeChar(); 107 osgNativeLib.keyboardUp(keyChar); 108 } 109 110 return true; 111 } 112 @Override onTouch(View v, MotionEvent event)113 public boolean onTouch(View v, MotionEvent event) { 114 115 //dumpEvent(event); 116 117 long time_arrival = event.getEventTime(); 118 int n_points = event.getPointerCount(); 119 int action = event.getAction() & MotionEvent.ACTION_MASK; 120 121 switch(n_points){ 122 case 1: 123 switch(action){ 124 case MotionEvent.ACTION_DOWN: 125 mode = moveTypes.DRAG; 126 127 osgNativeLib.mouseMoveEvent(event.getX(0), event.getY(0)); 128 if(navMode==navType.PRINCIPAL) 129 osgNativeLib.mouseButtonPressEvent(event.getX(0), event.getY(0), 2); 130 else 131 osgNativeLib.mouseButtonPressEvent(event.getX(0), event.getY(0), 1); 132 133 oneFingerOrigin.x=event.getX(0); 134 oneFingerOrigin.y=event.getY(0); 135 break; 136 case MotionEvent.ACTION_CANCEL: 137 switch(mode){ 138 case DRAG: 139 osgNativeLib.mouseMoveEvent(event.getX(0), event.getY(0)); 140 if(navMode==navType.PRINCIPAL) 141 osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 2); 142 else 143 osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 1); 144 break; 145 default : 146 Log.e(TAG,"There has been an anomaly in touch input 1point/action"); 147 } 148 mode = moveTypes.NONE; 149 break; 150 case MotionEvent.ACTION_MOVE: 151 152 osgNativeLib.mouseMoveEvent(event.getX(0), event.getY(0)); 153 154 oneFingerOrigin.x=event.getX(0); 155 oneFingerOrigin.y=event.getY(0); 156 157 break; 158 case MotionEvent.ACTION_UP: 159 switch(mode){ 160 case DRAG: 161 if(navMode==navType.PRINCIPAL) 162 osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 2); 163 else 164 osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 1); 165 break; 166 default : 167 Log.e(TAG,"There has been an anomaly in touch input 1 point/action"); 168 } 169 mode = moveTypes.NONE; 170 break; 171 default : 172 Log.e(TAG,"1 point Action not captured"); 173 } 174 break; 175 case 2: 176 switch (action){ 177 case MotionEvent.ACTION_POINTER_DOWN: 178 //Free previous Action 179 switch(mode){ 180 case DRAG: 181 if(navMode==navType.PRINCIPAL) 182 osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 2); 183 else 184 osgNativeLib.mouseButtonReleaseEvent(event.getX(0), event.getY(0), 1); 185 break; 186 } 187 mode = moveTypes.ZOOM; 188 distanceOrigin = sqrDistance(event); 189 twoFingerOrigin.x=event.getX(1); 190 twoFingerOrigin.y=event.getY(1); 191 oneFingerOrigin.x=event.getX(0); 192 oneFingerOrigin.y=event.getY(0); 193 194 osgNativeLib.mouseMoveEvent(oneFingerOrigin.x,oneFingerOrigin.y); 195 osgNativeLib.mouseButtonPressEvent(oneFingerOrigin.x,oneFingerOrigin.y, 3); 196 osgNativeLib.mouseMoveEvent(oneFingerOrigin.x,oneFingerOrigin.y); 197 198 case MotionEvent.ACTION_MOVE: 199 float distance = sqrDistance(event); 200 float result = distance-distanceOrigin; 201 distanceOrigin=distance; 202 203 if(result>1||result<-1){ 204 oneFingerOrigin.y=oneFingerOrigin.y+result; 205 osgNativeLib.mouseMoveEvent(oneFingerOrigin.x,oneFingerOrigin.y); 206 } 207 208 break; 209 case MotionEvent.ACTION_POINTER_UP: 210 mode =moveTypes.NONE; 211 osgNativeLib.mouseButtonReleaseEvent(oneFingerOrigin.x,oneFingerOrigin.y, 3); 212 break; 213 case MotionEvent.ACTION_UP: 214 mode =moveTypes.NONE; 215 osgNativeLib.mouseButtonReleaseEvent(oneFingerOrigin.x,oneFingerOrigin.y, 3); 216 break; 217 default : 218 Log.e(TAG,"2 point Action not captured"); 219 } 220 break; 221 } 222 223 return true; 224 } 225 226 //Ui Listeners 227 OnClickListener uiListenerCenterView = new OnClickListener() { 228 public void onClick(View v) { 229 //Log.d(TAG, "Center View"); 230 osgNativeLib.keyboardDown(32); 231 osgNativeLib.keyboardUp(32); 232 } 233 }; 234 235 //Menu 236 237 //Android Life Cycle Menu 238 @Override onCreateOptionsMenu(Menu menu)239 public boolean onCreateOptionsMenu(Menu menu) { 240 MenuInflater inflater = getMenuInflater(); 241 inflater.inflate(R.menu.appmenu, menu); 242 return super.onCreateOptionsMenu(menu); 243 } 244 @Override onOptionsItemSelected(MenuItem item)245 public boolean onOptionsItemSelected(MenuItem item) { 246 // Handle item selection 247 switch (item.getItemId()) { 248 case R.id.menuShowKeyboard: 249 Log.d(TAG,"Keyboard"); 250 InputMethodManager mgr= (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE); 251 mgr.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); 252 return true; 253 default: 254 return super.onOptionsItemSelected(item); 255 } 256 } 257 258 //Utilities 259 /** Show an event in the LogCat view, for debugging */ dumpEvent(MotionEvent event)260 private void dumpEvent(MotionEvent event) { 261 String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", 262 "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; 263 StringBuilder sb = new StringBuilder(); 264 int action = event.getAction(); 265 int actionCode = action & MotionEvent.ACTION_MASK; 266 sb.append("event ACTION_").append(names[actionCode]); 267 if (actionCode == MotionEvent.ACTION_POINTER_DOWN 268 || actionCode == MotionEvent.ACTION_POINTER_UP) { 269 sb.append("(pid ").append( 270 action >> MotionEvent.ACTION_POINTER_ID_SHIFT); 271 sb.append(")"); 272 } 273 sb.append("["); 274 for (int i = 0; i < event.getPointerCount(); i++) { 275 sb.append("#").append(i); 276 sb.append("(pid ").append(event.getPointerId(i)); 277 sb.append(")=").append((int) event.getX(i)); 278 sb.append(",").append((int) event.getY(i)); 279 if (i + 1 < event.getPointerCount()) 280 sb.append(";"); 281 } 282 sb.append("]"); 283 //Log.d(TAG, sb.toString()); 284 } sqrDistance(MotionEvent event)285 private float sqrDistance(MotionEvent event) { 286 float x = event.getX(0) - event.getX(1); 287 float y = event.getY(0) - event.getY(1); 288 return (float)(Math.sqrt(x * x + y * y)); 289 } 290 291 }