2014-09-18 29 views
5

Tôi muốn biết cách vẽ hình chữ nhật ở vị trí và kích thước cụ thể.Vẽ hình chữ nhật trên SurfaceView

Tôi đã thử một vài thử nghiệm và ví dụ tại đây và trên web, nhưng không có gì hiệu quả đối với tôi.

Tôi đang sử dụng SurfaceView và SurfaceHolder để giữ bản xem trước máy ảnh.

Tôi chỉ muốn vẽ hình chữ nhật khi người dùng chạm vào màn hình.

Tôi không muốn sử dụng thư viện bên ngoài và Khi tôi cố gắng lấy canvas từ chủ sở hữu, tôi nhận được giá trị rỗng.

Hiện tại không có mã, không có gì hữu ích cho tôi, nếu ai đó có đầu mối làm thế nào để làm điều đó, tôi sẽ thử nó.

Đây là những gì tôi đã cố gắng:

Link 1

Link 2

Link 3

Nhờ sự giúp đỡ!

+0

Bề mặt SurfaceView đã cho chỉ có thể có một "nhà sản xuất". Kể từ khi máy ảnh được vẽ trên nó, bạn cũng không thể vẽ nó bằng Canvas. Bạn cần phải vẽ trên một bề mặt khác; tùy chọn hiệu quả nhất sẽ là sử dụng Chế độ xem trong suốt. Một cách tiếp cận khác là gửi máy ảnh đến SurfaceTexture và render nó với GLES, mang lại cho bạn sự tự do hoàn toàn. Xem ví dụ "kết cấu từ máy ảnh" trên https://github.com/google/grafika. – fadden

+0

Bạn có thể cho tôi ví dụ về cách tạo Chế độ xem trong suốt không? Tất cả những gì tôi tìm thấy là các ví dụ chỉ hiển thị hình chữ nhật và đặt chế độ xem là * setContentView (drawView); * so với tôi không thể thấy máy ảnh. – user2235615

Trả lời

5

Ok, Cảm ơn bạn đã tìm thấy giải pháp đơn giản nhất (ít nhất là đối với tôi).

Trước tiên tôi tạo ra một cái nhìn bề mặt và tập tin XML của tôi trông như thế này:

<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> 

Và hơn tôi đang tạo ra một người giữ cho bề mặt mới, đây là một phần của mã java của tôi:

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); 
    } 

cuối cùng tôi thực hiện một phương pháp gọi là '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); 
} 

Như bạn thấy, tôi xóa canvas mỗi lần, nếu tôi không làm điều này, bề mặt sẽ hiển thị thêm hình chữ nhật trên mỗi hình khác.

Đây là cách tôi gọi phương pháp này từ sự kiện một '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); 
      } 
     }; 

Hy vọng điều này sẽ hữu ích cho người khác.

+4

FWIW, nếu SurfaceView bề mặt chồng lên nhau, bạn cần phải cung cấp cho họ độ sâu khác nhau (Z đơn đặt hàng) bằng cách sử dụng API SurfaceHolder. Bạn có thể xem một Hoạt động với ba SurfaceView được chồng lấp phần mềm trong thử nghiệm đa bề mặt của Grafika (https://github.com/google/grafika/blob/master/src/com/android/grafika/MultiSurfaceActivity.java). – fadden

+0

Thực ra, đoạn mã trên đã làm việc cho tôi, nhưng bạn nói đúng. Tốt hơn là nên làm việc với Zorder. – user2235615

+0

Vâng @fadden, tôi chỉ không thể đạt được để làm việc hình chữ nhật hơn đặt giá trị z như bạn đã đề cập và nó hoạt động hoàn hảo, cảm ơn. – webmaster

Các vấn đề liên quan