JaRMoS  1.1
Java Reduced Model Simulations
 All Classes Namespaces Files Functions Variables Enumerator Groups Pages
GLView.java
Go to the documentation of this file.
1 package jarmos.app.visual;
2 
5 import android.content.Context;
6 import android.content.res.Configuration;
7 import android.opengl.GLSurfaceView;
8 import android.util.Log;
9 import android.view.KeyEvent;
10 import android.view.MotionEvent;
11 
24 public class GLView extends GLSurfaceView {
25 
29  private final float MIN_MOVE_DIST = 3f;
30 
31  @SuppressWarnings("unused")
32  private static final String LOG_TAG = GLView.class.getSimpleName();
33 
34  private GLRenderer glRend;
35 
36  private float x = 0;
37  private float y = 0;
38 
39  boolean ismTouch = false, togglePause = false;
40 
45  public GLView(Context context, VisualizationData visData) {
46  super(context);
47  setFocusableInTouchMode(true);
48  glRend = new GLRenderer(visData);
49 
50  Configuration c = getResources().getConfiguration();
51  if (c.orientation == Configuration.ORIENTATION_PORTRAIT) {
52  glRend.setOrientation(Orientation.PORTRAIT);
53  } else if (c.orientation == Configuration.ORIENTATION_LANDSCAPE) {
54  glRend.setOrientation(Orientation.LANDSCAPE);
55  }
56 
57  setRenderer(glRend);
58  }
59 
60  @Override
61  protected void onSizeChanged(int w, int h, int oldw, int oldh) {
62  super.onSizeChanged(w, h, oldw, oldh);
63  glRend.setSize(w, h);
64  Log.d("GLView", "On size changed: old w/h " + oldw + "/" + oldh + " new w/h" + w + "/" + h);
65  }
66 
70  public boolean onTouchEvent(final MotionEvent event) {
71  switch (event.getAction() & MotionEvent.ACTION_MASK) {
72  case MotionEvent.ACTION_DOWN:
73  ismTouch = false;
74  togglePause = true;
75  x = event.getX();
76  y = event.getY();
77  break;
78 
79  case MotionEvent.ACTION_UP:
80  // case MotionEvent.ACTION_POINTER_UP:
81  if (togglePause) {
82  glRend.togglePause();
83  togglePause = false;
84  }
85  break;
86  case MotionEvent.ACTION_MOVE:
87  // Normal case: one touch is moving around
88  if (!ismTouch) {
89  final float xdiff = (x - event.getX());
90  final float ydiff = (y - event.getY());
91  double diff = Math.sqrt(xdiff * xdiff + ydiff * ydiff);
92  if (diff > MIN_MOVE_DIST) {
93  togglePause = false;
94  queueEvent(new Runnable() {
95  public void run() {
96  glRend.isContinuousRotation = true;
97  glRend.addPos(-xdiff / 20.0f, ydiff / 20.0f);
98  }
99  });
100  }
101  x = event.getX();
102  y = event.getY();
103 
104  // Zoom case: two (or more) are down, get y difference between the first two.
105  } else {
106  final boolean in = y > event.getY(1) - event.getY(0);
107  // final float dist = (float) Math.sqrt(_x * _x + _y * _y);
108  // if (dist > 10f) {
109  queueEvent(new Runnable() {
110  public void run() {
111  if (in)
112  glRend.zoomIn();
113  else
114  glRend.zoomOut();
115  // glRend.zoom(dist / _dist * old_zoom);
116  }
117  });
118  // }
119  // _x = event.getX(0) - event.getX(0);
120  y = event.getY(1) - event.getY(0);
121  }
122  break;
123 
124  // A second pointer has been registered (for zoom)
125  case MotionEvent.ACTION_POINTER_DOWN:
126  ismTouch = true;
127  togglePause = false;
128  y = event.getY(1) - event.getY(0);
129  // _x = event.getX(0) - event.getX(0);
130  // _dist = (float) Math.sqrt(_x * _x + _y * _y);
131  break;
132  }
133  return true;
134  }
135 
139  public boolean onKeyDown(int keyCode, KeyEvent event) {
140  if (event.getAction() == MotionEvent.ACTION_DOWN) {
141  switch (keyCode) {
142  case 24: // KEYCODE_VOLUME_UP
143  glRend.nextColorField();
144  return true;
145  case 25: // KEYCODE_VOLUME_DOWN
146  glRend.prevColorField();
147  return true;
148  case 82: // KEYCODE_MENU
149  return true;
150  case 83: // KEYCODE_HOME
151  return true;
152  case 84: // KEYCODE_SEARCH
153  glRend.isFrontFace = !glRend.isFrontFace;
154  return true;
155  default:
156  return super.onKeyDown(keyCode, event);
157  }
158  }
159  return true;
160  }
161 
165  public boolean onTrackballEvent(MotionEvent event) {
166  float TBx = event.getX();
167  float TBy = event.getY();
168  if (event.getAction() == MotionEvent.ACTION_MOVE) {
169  // zoom in if trackball is moving in the 2D "positive" direction
170  if ((TBx >= 0) & (TBy <= 0))
171  glRend.zoomIn();
172  else
173  // and zoom out if not
174  glRend.zoomOut();
175  }
176  if (event.getAction() == MotionEvent.ACTION_DOWN) {
177  glRend.resetView();
178  }
179  return true;
180  }
181 
182  // /**
183  // * @param x
184  // * @param y
185  // * @param z
186  // */
187  // public void setSensorParam(float x, float y, float z) {
188  // if (isSensorCtrl) {
189  // glRend.addPos(false, -x / 1.50f, -y / 1.50f);
190  // }
191  // }
192 }
void onSizeChanged(int w, int h, int oldw, int oldh)
Definition: GLView.java:61
Open GL view implementation for display of and interaction with reduced model visualizations.
Definition: GLView.java:24
boolean onTrackballEvent(MotionEvent event)
Definition: GLView.java:165
OpenGL renderer implementation using the khronos OpenGL ES android implementation.
Definition: GLRenderer.java:21
GLView(Context context, VisualizationData visData)
Definition: GLView.java:45
A container class for all model visual data.
boolean onTouchEvent(final MotionEvent event)
Definition: GLView.java:70
boolean onKeyDown(int keyCode, KeyEvent event)
Definition: GLView.java:139