2014-09-18 2 views
5

특정 위치와 크기로 직사각형을 그리는 방법을 알고 싶습니다.SurfaceView의 직사각형 그리기

나는 여기와 웹에서 몇 가지 시련과 예제를 시도했지만 나에게는 아무런 효과가 없었다.

카메라 미리보기를 유지하기 위해 SurfaceView와 SurfaceHolder를 사용하고 있습니다.

사용자가 화면을 터치 할 때 직사각형을 그 으려 고합니다.

외부 라이브러리를 사용하고 싶지 않습니다. 홀더에서 캔버스를 가져 오려고 할 때 null이 표시됩니다.

지금은 코드가 없으므로 나를 위해 아무런 효과가 없습니다. 누군가 어떻게해야하는지 실마리가 있다면 시도해 보겠습니다.

이것은 이미 시도한 것입니다 : 도움을

Link 1

Link 2

Link 3

감사합니다!

+0

주어진 SurfaceView 표면에는 하나의 "생산자"만있을 수 있습니다. 카메라가 그려져 있기 때문에 캔버스로 그릴 수 없습니다. 다른 서페이스에 그려야합니다. 가장 효율적인 옵션은 투명한 뷰를 사용하는 것입니다. 또 다른 방법은 카메라를 SurfaceTexture로 보내고 GLES로 렌더링하는 것입니다. 그러면 GLES로 렌더링되므로 완전히 자유롭게 사용할 수 있습니다. 예 : https://github.com/google/grafika의 '카메라의 질감' – fadden

+0

투명한 뷰를 생성하는 방법을 보여줄 수 있습니까? 내가 발견 한 것은 직사각형 만 표시하고 뷰를 * setContentView (drawView); *로 설정 한 예제입니다. 카메라가 보이지 않는 것보다. – user2235615

답변

5

좋아요, fadden 덕분에 가장 쉬운 해결책을 찾았습니다 (적어도 나를 위해).

먼저 내가 다른 표면보기를 만들어 내 XML 파일은 다음과 같이 :

:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollView1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:opencv="http://schemas.android.com/apk/res-auto" 
    android:layout_gravity="left|top"> 
     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" > 

        <SurfaceView 
         android:layout_alignParentTop="true" 
         android:id="@+id/CameraView" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" /> 
        <SurfaceView 
         android:layout_alignParentTop="true" 
         android:id="@+id/TransparentView" 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" /> 
      </RelativeLayout> 
</RelativeLayout> 

그리고 새로운 표면에 대한 또 다른 홀더를 생성하고있어보다가,이 내 자바 코드의 일부이다 나는 메서드를 호출 구현할 마침내

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_video_capture); 
     // Create first surface with his holder(holder) 
     cameraView = (SurfaceView)findViewById(R.id.CameraView); 
     cameraView.setOnTouchListener(onTouchListner); 

     holder = cameraView.getHolder(); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     // Create second surface with another holder (holderTransparent) 
     transparentView = (SurfaceView)findViewById(R.id.TransparentView); 

     holderTransparent = transparentView.getHolder(); 
     holderTransparent.setFormat(PixelFormat.TRANSPARENT); 
     holderTransparent.addCallback(callBack); 
     holderTransparent.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

'DrawFocusRect'

private void DrawFocusRect(float RectLeft, float RectTop, float RectRight, float RectBottom, int color) 
{ 

    canvas = holderTransparent.lockCanvas(); 
    canvas.drawColor(0,Mode.CLEAR); 
    //border's properties 
    paint = new Paint(); 
    paint.setStyle(Paint.Style.STROKE); 
    paint.setColor(color); 
    paint.setStrokeWidth(3); 
    canvas.drawRect(RectLeft, RectTop, RectRight, RectBottom, paint); 


    holderTransparent.unlockCanvasAndPost(canvas); 
} 

당신이 볼 수 있듯이, 내가 지우 캔버스 때마다, 내가이 일을하지 않으면 표면에 더 많은 사각형이 서로 표시됩니다.

이 내가 'OnTouchListener'이벤트에서이 메서드를 호출하는 방법입니다 :이 다른 사람에게 도움이 될 것

OnTouchListener onTouchListner = new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
        RectLeft = event.getX() - 100; 
        RectTop = event.getY() - 100 ; 
        RectRight = event.getX() + 100; 
        RectBottom = event.getY() + 100; 
        DrawFocusRect(RectLeft , RectTop , RectRight , RectBottom , Color.BLUE); 
      } 
     }; 

희망.

+4

FWIW, SurfaceView 서페이스가 겹치는 경우 SurfaceHolder API를 사용하여 서로 다른 심도 (Z 순서)를 지정해야합니다. Grafika의 멀티 - 표면 테스트 (https://github.com/google/grafika/blob/master/src/com/android/grafika/MultiSurfaceActivity.java)에서 세 개의 소프트웨어로 렌더링 된 SurfaceViews가 겹쳐져있는 Activity를 볼 수 있습니다. – fadden

+0

사실, 위의 코드는 저에게 효과적 이었지만 여러분이 옳습니다. Zorder와 함께 작업하는 것이 좋습니다. – user2235615

+0

예 @fadden, 내가 언급 한 z 값을 설정하는 것보다 직사각형을 작동시키지 못했습니다. 완벽하게 작동했습니다. 감사합니다. – webmaster

관련 문제