package com.android.droidgraph.scene; import java.io.File; import java.io.FileOutputStream; import android.content.Context; import android.graphics.Bitmap; import android.opengl.GLSurfaceView; import android.os.Environment; import android.view.KeyEvent; import android.view.MotionEvent; import com.android.droidgraph.renderer.BufferedRenderer; import com.android.droidgraph.renderer.SGRenderer; import com.android.droidgraph.util.Settings; public class SGView extends GLSurfaceView { // private String TAG = "SGRenderer"; // the renderer that handles all drawing private SGRenderer mRenderer; private BufferedRenderer mBufferedRenderer; private SGGroup sceneGroup; private SGNode scene; private Settings mSettings; private int[] viewport = new int[4]; public SGView(Context context, Settings settings) { super(context); mSettings = settings; mSettings.setContext(context); mSettings.setView(this); mRenderer = new SGRenderer(this, settings); mBufferedRenderer = new BufferedRenderer(this, settings); mBufferedRenderer.setContext(context); mRenderer.setContext(context); setRenderer(mBufferedRenderer); // setRenderer(mRenderer); // Request focus, otherwise buttons won't react this.requestFocus(); this.setFocusableInTouchMode(true); viewport[0] = 0; viewport[2] = 0; viewport[2] = viewport[3] = 1; } @Override protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) { super.onSizeChanged(xNew, yNew, xOld, yOld); viewport[2] = xNew; viewport[3] = yNew; } @Override public void setRenderMode(int mode) { super.setRenderMode(mode); mBufferedRenderer.setRenderMode(mode); } SGGroup getSceneGroup() { return sceneGroup; } public final SGNode getScene() { return scene; } void removeScene() { scene = null; sceneGroup = null; markDirty(); } public void setScene(SGNode scene) { SGView oldview = scene.getPanel(); if (oldview != null && oldview.getScene() == scene) { oldview.removeScene(); } SGParent oldParent = scene.getParent(); if (oldParent != null) { oldParent.remove(scene); } this.scene = scene; sceneGroup = new SGGroup(); sceneGroup.add(scene); sceneGroup.setParent(this); mBufferedRenderer.setSceneGroup(scene); mRenderer.setSceneGroup(scene); } final void markDirty() { // mark dirty } /** * Override the touch screen listener. * * React to moves and presses on the touchscreen. */ @Override public boolean onTouchEvent(MotionEvent e) { handleEvent(e); // We handled the event return true; } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { queueEvent(new Runnable() { // This method will be called on the rendering // thread: public void run() { // call to renderer } }); return true; } return super.onKeyDown(keyCode, event); } /** Show an event in the LogCat view, for debugging */ @SuppressWarnings("unused") private void dumpEvent(MotionEvent event) { String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; StringBuilder sb = new StringBuilder(); int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; sb.append("event ACTION_").append(names[actionCode]); if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { sb.append("(pid ").append( action >> MotionEvent.ACTION_POINTER_ID_SHIFT); sb.append(")"); } sb.append("["); for (int i = 0; i < event.getPointerCount(); i++) { sb.append("#").append(i); sb.append("(pid ").append(event.getPointerId(i)); sb.append(")=").append((float) event.getX(i) / getWidth()); sb.append(",").append((float) event.getY(i) / getHeight()); if (i + 1 < event.getPointerCount()) sb.append(";"); } sb.append("]"); // Log.d("TouchEvent info", sb.toString()); } /** Show an event in the LogCat view, for debugging */ private void handleEvent(MotionEvent event) { int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; if (actionCode == 0) { // Paint with colorID color mSettings.setPickPoint(event); mSettings.pick(true); } else if (actionCode == 2) { } } public static byte floatToByteValue(float f) { return (byte) ((int) (f * 255f)); } static String saveBitmap(Bitmap bitmap, String dir, String baseName) { try { File sdcard = Environment.getExternalStorageDirectory(); File pictureDir = new File(sdcard, dir); pictureDir.mkdirs(); File f = null; for (int i = 1; i < 200; ++i) { String name = baseName + i + ".png"; f = new File(pictureDir, name); if (!f.exists()) { break; } } if (!f.exists()) { String name = f.getAbsolutePath(); FileOutputStream fos = new FileOutputStream(name); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); return name; } } catch (Exception e) { } finally { /* * if (fos != null) { fos.close(); } */ } return null; } }