8

Im mới để phát triển Android và tôi thấy khó tìm các ví dụ hay về camera2 api.Android SDK - camera2 - Vẽ hình chữ nhật trên TextureView

Im làm việc theo cách của tôi từ từ thông qua hầu hết các vấn đề, nhưng trên vấn đề này tôi bị kẹt. Trong máy ảnh mặc định, khi bạn chạm vào màn hình để lấy nét, nó sẽ hiển thị hình chữ nhật của vùng lấy nét trong một khoảnh khắc. Tôi muốn làm một cái gì đó tương tự (Hoặc trong trường hợp này, điều tương tự chính xác để bắt đầu với vì vậy tôi có thể tìm ra nó).

Tôi đọc ở đâu đó (tôi nghĩ trang TextureView trong tài liệu SDK) mà bạn không thể vẽ trên một lần xem văn bản trong khi nó được sử dụng làm bản xem trước máy ảnh - và gọi phương thức khóa sẽ trả về giá trị thay vì canvas.

Tôi tìm thấy trực tuyến này: https://github.com/commonsguy/vidtry/ Nhưng tôi không thể làm cho nó hoạt động. Tôi có thể nhận được lỗi nói rằng quan điểm chính của tôi không thể chuyển sang chế độ xem có thể vẽ hoặc ngược lại - Hoặc chế độ xem có thể vẽ được của tôi ở trên cùng và làm cho màn hình đen - Hoặc ở dưới cùng và không phản hồi các sự kiện chạm (và cố gắng bắt buộc performClick từ chế độ xem phía trên nó sẽ gặp sự cố.)

Im stuck! Bất cứ ai có thể cho tôi một lời giải thích hoặc ví dụ về cách tôi có thể vẽ hình chữ nhật của tôi trên vị trí sự kiện cho một vài sconds?

Cảm ơn!

+1

Không vẽ trên TextureView. Đặt một (chủ yếu là minh bạch) Xem trên đầu trang, và vẽ trên đó. – fadden

+0

Tôi đã thử - không thể làm điều đó. bạn có thể đưa ra một ví dụ không? – aescript

+0

Được rồi vì vậy tôi có một chế độ xem khác trên đầu trang - tuy nhiên tôi chỉ có thể xem bản xem trước của cam nếu tôi đặt chế độ xem alpha thành 0 và bakcground: = "# 0000" nhưng sau đó tôi không thể thấy hình chữ nhật của mình .... hãy thử và cung cấp cho nó alpha ...Tôi đang làm một cái gì đó sai hoặc là SDK này chỉ terribly khó hiểu so với những thứ như GL/QT – aescript

Trả lời

4
  1. Đầu tiên ví dụ về android2 camera2 api có mã mẫu mã nguồn mở google. https://github.com/googlesamples/android-Camera2Basic
  2. thứ hai cho Phần nơi bạn muốn vẽ một hình chữ nhật (liên lạc để tập trung) theo các bước sau -
    • Tạo một lớp tùy chỉnh kéo dài đến SurfaceView.
    • gọi phương thức onTouchListener trong lớp tùy chỉnh này để phát hiện tọa độ ngón tay và vẽ hình chữ nhật của bạn bằng cách sử dụng lớp sơn trong Android. -thêm lớp tùy chỉnh này bên trên TextureView của bạn đang hiển thị bản xem trước từ camera2.
    • bật chế độ xem tùy chỉnh trong suốt.
    • cuối cùng khi bạn chạm vào một số điểm trên màn hình thiết bị thì onTouchListener sẽ được gọi là sẽ vẽ trên canvas của chế độ xem tùy chỉnh mà bạn đã thêm phía trên chế độ xem trước máy ảnh.
    • cuối cùng xóa canvas của bạn để bạn không tiếp tục thêm hình chữ nhật vào chế độ xem tùy chỉnh vì bạn cần một lần chỉnh sửa tại một thời điểm.
    • cũng nếu không được chạm vào một thời gian, hình chữ nhật sẽ biến mất. làm điều này bằng cách sử dụng trình xử lý từ chế độ xem tùy chỉnh.

Tôi đang cung cấp cho bạn mã thử nghiệm để thực hiện việc này. Tôi hy vọng nó sẽ giúp bạn. MAY MẮN NHẤT.

private class CustomView extends SurfaceView { 

    private final Paint paint; 
    private final SurfaceHolder mHolder; 
    private final Context context; 

    public CustomView(Camera2BasicFragment context) { 
     super(context.getActivity().getBaseContext()); 
     mHolder = getHolder(); 
     mHolder.setFormat(PixelFormat.TRANSPARENT); 
     this.context = context.getActivity().getBaseContext(); 
     paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     paint.setColor(Color.WHITE); 
     paint.setStyle(Paint.Style.STROKE); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      invalidate(); 
      if (mHolder.getSurface().isValid()) { 
       final Canvas canvas = mHolder.lockCanvas(); 
       Log.d("touch", "touchRecieved by camera"); 
       if (canvas != null) { 
        Log.d("touch", "touchRecieved CANVAS STILL Not Null"); 
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
        canvas.drawColor(Color.TRANSPARENT); 
        canvas.drawCircle(event.getX(), event.getY(), 100, paint); 
        mHolder.unlockCanvasAndPost(canvas); 
        new Handler().postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          Canvas canvas1 = mHolder.lockCanvas(); 
          if(canvas1 !=null){ 
           canvas1.drawColor(0, PorterDuff.Mode.CLEAR); 
           mHolder.unlockCanvasAndPost(canvas1); 
          } 

         } 
        }, 1000); 

       } 
       mHolder.unlockCanvasAndPost(canvas); 


      } 
     } 


     return false; 
    } 
} 
+0

Sahil Reader: bạn có thể giải thích cách thêm nó không? trong bước một, tôi đã tải về mã Camera2Basic. tôi có thể thêm lớp này vào Camera2BasicFragment.java trong mã mẫu từ bước 1 không? – David

1

Tôi đã giải quyết nó -Tôi đã đặt chế độ xem bề mặt của mình thành drawColor (Color.TRANSPARENT) với cờ rõ ràng và tất cả đều ổn.

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