2011-04-11 3 views
0

* 내가 화면을 터치하고 내 코드에 문제가 있습니다 경우 다음 큐브 내가 모르는 위치 변경됩니다 원하는 *안드로이드 오버레이 및 touchevent

public class GLCamTest extends Activity { 
private CamLayer mPreview; 
private GLLayer glView,myRender; 
static int counter=0; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    GLSurfaceView glView = new GLSurfaceView(this); 
    myRender = new GLLayer(this); 
    glView.setRenderer(myRender); 

    counter++; 
    if (counter==2) { 
     MediaPlayer mp=MediaPlayer.create(this, R.raw.track); 
     mp.start(); 
    } 
} 



/** Called when the activity is first created. */ 
@Override 
public void onResume() { 
    super.onResume(); 



    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    final Window win = getWindow(); 
    win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    // Hide the window title. 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 


    GLSurfaceView glView = new GLSurfaceView(this); 
    myRender = new GLLayer(this); 
    glView.setRenderer(myRender); 




    glView=new GLLayer(this); 

    mPreview = new CamLayer(this, (PreviewCallback) glView);//有改過 

    /*x1=new GLLayer(this); 
    glView.setRenderer(x1);*/ 
    setContentView(glView); 

    addContentView(mPreview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

} 


@Override 
public boolean onTouchEvent(MotionEvent event) 
{  super.onResume(); 
    if(event.getAction() == MotionEvent.ACTION_DOWN) 
     myRender.light = !myRender.light; 

    return super.onTouchEvent(event); 
} 




protected void onPause() { 
    super.onPause(); 
    if (counter>=2) { 
     System.exit(0); 
    }  
}}` 

package de.offis.magic.core; 

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 
import java.nio.IntBuffer; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.content.Context; 
import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.opengl.GLSurfaceView; 
import android.opengl.GLU; 
import android.opengl.GLSurfaceView.Renderer; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.ViewGroup.LayoutParams; 
import android.os.Bundle; 
/** 
* This class uses OpenGL ES to render the camera's viewfinder image on the 
* screen. Unfortunately I don't know much about OpenGL (ES). The code is mostly 
* copied from some examples. The only interesting stuff happens in the main 
* loop (the run method) and the onPreviewFrame method. 
*/ 
public class GLLayer extends GLSurfaceView implements SurfaceHolder.Callback, 
     Camera.PreviewCallback, Renderer { 

    int onDrawFrameCounter=1; 
    int[] cameraTexture; 
    byte[] glCameraFrame=new byte[1024*1024]; //size of a texture must be a power of 2 
    FloatBuffer cubeBuff,cubeBuff2; 
    FloatBuffer texBuff,texBuff2; 
    public boolean light = true; 

    public GLLayer(Context c) { 
     super(c); 

     this.setEGLConfigChooser(5, 6, 5, 8, 16, 0); // red, green, blue, alpha depth 
     this.setRenderer(this); //渲染 
     this.getHolder().setFormat(PixelFormat.TRANSLUCENT); //半透明 
    } 

    public void onDrawFrame(GL10 gl) { 
     onDrawFrameCounter++; 


     gl.glEnable(GL10.GL_TEXTURE_2D); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //清除螢幕和深度緩存 

     //bindCameraTexture(gl); //補camera捕捉到的變成紋理 

     gl.glLoadIdentity(); //重置矩陣 
     GLU.gluLookAt(gl, 0, 0, 4.2f, 0, 0, 0, 0, 1, 0);//http://pyopengl.sourceforge.net/documentation/ref/glu/lookat.html 
     gl.glTranslatef(-4,1,-3); 
     gl.glRotatef(onDrawFrameCounter,1,10,0); //Rotate the camera image 角度 x y z 
     gl.glTranslatef(-5,2,-3); 
     gl.glRotatef((float)Math.tan(onDrawFrameCounter/20.0f)*10,0,1,0); //Rotate the camera image 
     gl.glTranslatef(-1,0,0); 
     gl.glRotatef((float)Math.sin(onDrawFrameCounter/20.0f)*100,1,0,0); //Rotate the camera image 

     gl.glNormal3f(0,0,1); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);   
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12, 4); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16, 4); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20, 4); 





      gl.glRotatef((float)Math.sin(onDrawFrameCounter/20.0f)*100,1,0,0); //Rotate the camera image 

     //bindCameraTexture(gl); //補camera捕捉到的變成紋理 
     gl.glLoadIdentity(); 
     gl.glTranslatef(5,2,-6); 
     gl.glRotatef(onDrawFrameCounter,0,1,0); //Rotate the camera image 角度 x y z 
     gl.glNormal3f(0,0,1); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);   
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,12, 4); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,16, 4); 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP,20, 4); 



     if (!light) 
     { 
      gl.glTranslatef(-4,2,-6); 

     } 
     else 
     { 
      gl.glTranslatef(-4,2,-6); 
     } 





    } 

    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     gl.glViewport(0, 0, width, height);    // 設定圖形要顯示的區域 


     float ratio = (float)2* width/height; 
     gl.glMatrixMode(GL10.GL_PROJECTION);   //設投影矩陣 
     gl.glLoadIdentity();       //重置 
     gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10); //選擇模型觀察矩陣 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     GLU.gluLookAt(gl, 0, 0, 4.2f, 0, 0, 0, 0, 1, 0);   
    } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 

     gl.glClearColor(0, 0, 0, 0); 
     gl.glEnable(GL10.GL_CULL_FACE); 
     gl.glShadeModel(GL10.GL_SMOOTH); 
     gl.glEnable(GL10.GL_DEPTH_TEST); 

     cubeBuff = makeFloatBuffer(camObjCoord); 
     texBuff = makeFloatBuffer(camTexCoords); 
     cubeBuff2 = makeFloatBuffer(camObjCoord); 
     texBuff2 = makeFloatBuffer(camTexCoords); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeBuff);    //設頂點座標 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeBuff2); 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);     //開紋理 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texBuff); 
     gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texBuff2);//將紋理連繫到物體 

     gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    } 






    /** 
    * Generates a texture from the black and white array filled by the onPreviewFrame 
    * method. 
    */ 
    void bindCameraTexture(GL10 gl) { 
     synchronized(this) { 
      if (cameraTexture==null) 
       cameraTexture=new int[1]; 
      else 
       gl.glDeleteTextures(1, cameraTexture, 0); 

      gl.glGenTextures(1, cameraTexture, 0); //建紋理 
      int tex = cameraTexture[0];     
      gl.glBindTexture(GL10.GL_TEXTURE_2D, tex); 
      gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_LUMINANCE, 256, 256, 0, GL10.GL_LUMINANCE, GL10.GL_UNSIGNED_BYTE, ByteBuffer.wrap(glCameraFrame)); 
      gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
     } 
    } 

    /** 
    * This method is called if a new image from the camera arrived. The camera 
    * delivers images in a yuv color format. It is converted to a black and white 
    * image with a size of 256x256 pixels (only a fraction of the resulting image 
    * is used). Afterwards Rendering the frame (in the main loop thread) is started by 
    * setting the newFrameLock to true. 
    */ 
    public void onPreviewFrame(byte[] yuvs, Camera camera) {   
     int bwCounter=0; 
     int yuvsCounter=0; 
     for (int y=0;y<160;y++) { 
      System.arraycopy(yuvs, yuvsCounter, glCameraFrame, bwCounter, 240); 
      yuvsCounter=yuvsCounter+240; 
      bwCounter=bwCounter+256; 
     } 
    } 

    FloatBuffer makeFloatBuffer(float[] arr) { 
     ByteBuffer bb = ByteBuffer.allocateDirect(arr.length*4); 
     bb.order(ByteOrder.nativeOrder()); 
     FloatBuffer fb = bb.asFloatBuffer(); 
     fb.put(arr); 
     fb.position(0); 
     return fb; 
    } 




    final static float camObjCoord[] = new float[] { 
       // FRONT 
       -2.0f, -1.5f, 2.0f, 
       2.0f, -1.5f, 2.0f, 
       -2.0f, 1.5f, 2.0f, 
        2.0f, 1.5f, 2.0f, 
       // BACK 
       -2.0f, -1.5f, -2.0f, 
       -2.0f, 1.5f, -2.0f, 
        2.0f, -1.5f, -2.0f, 
        2.0f, 1.5f, -2.0f, 
       // LEFT 
       -2.0f, -1.5f, 2.0f, 
       -2.0f, 1.5f, 2.0f, 
       -2.0f, -1.5f, -2.0f, 
       -2.0f, 1.5f, -2.0f, 
       // RIGHT 
        2.0f, -1.5f, -2.0f, 
        2.0f, 1.5f, -2.0f, 
        2.0f, -1.5f, 2.0f, 
        2.0f, 1.5f, 2.0f, 
       // TOP 
       -2.0f, 1.5f, 2.0f, 
        2.0f, 1.5f, 2.0f, 
       -2.0f, 1.5f, -2.0f, 
        2.0f, 1.5f, -2.0f, 
       // BOTTOM 
       -2.0f, -1.5f, 2.0f, 
       -2.0f, -1.5f, -2.0f, 
        2.0f, -1.5f, 2.0f, 
        2.0f, -1.5f, -2.0f, 
      }; 
      final static float camTexCoords[] = new float[] { 
       // Camera preview 
       0.0f, 0.0f, 
       0.9375f, 0.0f, 
       0.0f, 0.625f, 
       0.9375f, 0.625f, 

       // BACK 
       0.9375f, 0.0f, 
       0.9375f, 0.625f, 
       0.0f, 0.0f, 
       0.0f, 0.625f, 
       // LEFT 
       0.9375f, 0.0f, 
       0.9375f, 0.625f, 
       0.0f, 0.0f, 
       0.0f, 0.625f, 
       // RIGHT 
       0.9375f, 0.0f, 
       0.9375f, 0.625f, 
       0.0f, 0.0f, 
       0.0f, 0.625f, 
       // TOP 
       0.0f, 0.0f, 
       0.9375f, 0.0f, 
       0.0f, 0.625f, 
       0.9375f, 0.625f, 
       // BOTTOM 
       0.9375f, 0.0f, 
       0.9375f, 0.625f, 
       0.0f, 0.0f, 
       0.0f, 0.625f   
      }; 

} 

* 화면을 터치하고 큐브가 위치를 변경하려고합니다 내 코드가 어디에 잘못되었는지 알 수 없습니다. *

답변

0

onTouchEvent (...)는 활동이 아닌보기 클래스에 구현해야합니다.
Android SDK의 TouchRotateActivity 예를 참조하십시오.

0
glview.setonTouchListener(new View.onTouchListener(){ 

    public boolean onTouch(View v,MotionEvent event){ 

     int action = event.getAction(); 

     if(action == MotionEvent.ACTION_DOWN) 
     { 
      //action to be performed 
      return true; 
     } 
     return false; 
    } 
}); 
관련 문제