14

Android 開発は初めてで、camera2 API で良い例を見つけるのが難しいと感じています。

私はほとんどの問題をゆっくりと進めていますが、これについては行き詰まっています。デフォルトのカメラでは、画面をタッチしてフォーカスを合わせると、フォーカス エリアの長方形が一瞬表示されます。私は似たようなことをしたいです(または、この場合、まったく同じことから始めて、それを理解できるようにします)。

カメラのプレビューとして使用されているときにテクスチャビューに描画できない場所(SDKドキュメントのTextureViewページだと思います)を読みました.lockメソッドを呼び出すと、キャンバスではなくnullが返されます。

私はこれをオンラインで見つけました: https ://github.com/commonsguy/vidtry/ しかし、私はそれを動作させることができません。メインビューをドローアブルビューにキャストできない、またはその逆というエラーが発生します-または、ドローアブルビューが上にあり、画面が黒くなります-または、下にあり、タッチイベントに応答しません(強制しようとしています)上記のビューからの performClick は、クラッシュを引き起こします。)

立ち往生!イベント位置に長方形を数秒間描画する方法の説明や例を誰か教えてもらえますか?

ありがとう!

4

3 に答える 3

6
  1. まず、camera2 api android の例として、オープン ソースの google サンプル コードがあります。https://github.com/googlesamples/android-Camera2Basic
  2. 次に、長方形を描きたい部分(タッチしてフォーカス)は、次の手順に従います-
    • SurfaceView を拡張するカスタム クラスを作成します。
    • このカスタム クラスで onTouchListener メソッドを呼び出して、指の座標を検出し、android のペイント クラスを使用して四角形を描画します。-camera2 からのプレビューを表示している TextureView の上に、このカスタム クラスを追加します。
    • カスタム ビューを透明にします。
    • デバイス画面のある時点でタッチすると、 onTouchListener が呼び出され、カメラ プレビューの上に追加したカスタム ビューのキャンバスに描画されます。
    • 最後に、キャンバスをクリアして、カスタム ビューに四角形を追加し続けないようにします。一度に 1 つの四角形しか必要ないためです。
    • また、しばらく触れないと四角形が消えるはずです。カスタムビューのハンドラーを使用してこれを行います。

これを行うためのテスト済みコードをいくつか提供します。お役に立てば幸いです。幸運を祈ります。

 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", "touchReceived by camera");
                if (canvas != null) {
                    Log.d("touch", "touchReceived 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;
    }
}
于 2016-07-23T03:23:58.873 に答える
1

私はそれを解決しました-明確なフラグを付けてサーフェスビューを drawColor(Color.TRANSPARENT) に設定する必要があり、すべて問題ありませんでした。

于 2015-07-03T08:18:46.897 に答える