2013-07-03 2 views
0

Я хочу нарисовать Rect на SurfaceView, когда пользователь коснется экрана. Когда они двигают пальцем, он перемещает Rect вместе с ним. Пользователь также может задать размер Rect. В основном это инструмент выбора.Как нарисовать SurfaceView в Android

До сих пор у меня есть следующий код:

private void selectPoints(){ 
    //retrieve X and Y values from touch 
    surfaceView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent pos) { 
      int eventAction = pos.getAction(); 
      switch (eventAction) { 
       case MotionEvent.ACTION_DOWN: 
        Log.d("X",String.valueOf(pos.getX())); 
        Log.d("Y",String.valueOf(pos.getY())); 
        break; 

       case MotionEvent.ACTION_UP: 
        Log.d("X",String.valueOf(pos.getX())); 
        Log.d("Y",String.valueOf(pos.getY())); 
        break; 
      }  

      return true;       
     } 
    });  
} 

Однако я не уверен в том, как рисовать на SurfaceView. Любые советы/помощь?

Спасибо!

ответ

1

Реализовать рендерер от интерфейса GLSurfaceView.Renderer и обеспечивают реализацию для следующих методов:

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    // TDOD 
} 

public void onSurfaceChanged(GL10 gl, int w, int h) { 
    // TDOD 
} 

public void onDrawFrame(GL10 gl) {  
    // You would draw here 
} 

onDrawFrame() метод может быть вызван вашим surfaceView.requestRender();

+0

Спасибо за ваш ответ @Raj. Я не буду использовать GLSurfaceView, хотя мне не нужно рисовать 3D-изображения. Я считаю, что могу достичь своей цели, используя SurfaceView и метод OnDraw() ... это только КАК это сделать. – LKB

1

Got it. Я использую SurfaceView для своей пользовательской камеры в Android. Я не уверен, поможет вам это или нет. Но это, как я это делаю:

public class CameraPreview extends SurfaceView{ 

    private SurfaceHolder mHolder; 
    private Camera mCamera;  

    public CameraPreview(Context context, Camera camera) { 
    super(context); 
    // Rest of the code for initialization 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // set preview size and make any resize, rotate or 
    // reformatting changes here 

    // start preview with new settings 
    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 

    } catch (Exception e){ 
     Log.e("CameraPreview : surfaceChanged()", "Error starting camera preview: " + e.getMessage(),e); 
    } 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
    try { 
     if (mCamera != null) { 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } 
    } catch (IOException e) { 
     Log.e("CameraPreview : surfaceCreated()", "Error setting camera preview: " + e.getMessage(), e); 
    } 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
    } 

Тогда в моей деятельности я инициализировать SurfaceView следующим образом:

cameraPreview = new CameraPreview(this, mCamera); 
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview); 
preview.addView(mPreview); 

Смотрите, если есть какой-либо полезный экстракт из этого куска кода.

Смежные вопросы