From 8942eaf0d79e49c6fdf19965b2ab2bed923f9805 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Mon, 11 Mar 2013 11:17:19 +0400 Subject: [PATCH] Stetch support for Android View classes added (Feature #2840) --- .../java/android+CameraBridgeViewBase.java | 19 ++++++++++++++++++- .../src/java/android+JavaCameraView.java | 6 ++++++ .../src/java/android+NativeCameraView.java | 6 ++++++ .../res/layout/tutorial3_surface_view.xml | 4 ++-- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/modules/java/generator/src/java/android+CameraBridgeViewBase.java b/modules/java/generator/src/java/android+CameraBridgeViewBase.java index 4dd3af96f..e76ac26c5 100644 --- a/modules/java/generator/src/java/android+CameraBridgeViewBase.java +++ b/modules/java/generator/src/java/android+CameraBridgeViewBase.java @@ -15,6 +15,7 @@ import android.content.DialogInterface; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Rect; import android.util.AttributeSet; import android.util.Log; import android.view.SurfaceHolder; @@ -44,6 +45,7 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac protected int mFrameHeight; protected int mMaxHeight; protected int mMaxWidth; + protected float mScale = 0; protected int mPreviewFormat = Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA; protected int mCameraIndex = -1; protected boolean mEnabled; @@ -389,7 +391,22 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR); - canvas.drawBitmap(mCacheBitmap, (canvas.getWidth() - mCacheBitmap.getWidth()) / 2, (canvas.getHeight() - mCacheBitmap.getHeight()) / 2, null); + Log.d(TAG, "mStretch value: " + mScale); + + if (mScale != 0) { + canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()), + new Rect((int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2), + (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2), + (int)((canvas.getWidth() - mScale*mCacheBitmap.getWidth()) / 2 + mScale*mCacheBitmap.getWidth()), + (int)((canvas.getHeight() - mScale*mCacheBitmap.getHeight()) / 2 + mScale*mCacheBitmap.getHeight())), null); + } else { + canvas.drawBitmap(mCacheBitmap, new Rect(0,0,mCacheBitmap.getWidth(), mCacheBitmap.getHeight()), + new Rect((canvas.getWidth() - mCacheBitmap.getWidth()) / 2, + (canvas.getHeight() - mCacheBitmap.getHeight()) / 2, + (canvas.getWidth() - mCacheBitmap.getWidth()) / 2 + mCacheBitmap.getWidth(), + (canvas.getHeight() - mCacheBitmap.getHeight()) / 2 + mCacheBitmap.getHeight()), null); + } + if (mFpsMeter != null) { mFpsMeter.measure(); mFpsMeter.draw(canvas, 20, 30); diff --git a/modules/java/generator/src/java/android+JavaCameraView.java b/modules/java/generator/src/java/android+JavaCameraView.java index 962899ad8..34fe6091a 100644 --- a/modules/java/generator/src/java/android+JavaCameraView.java +++ b/modules/java/generator/src/java/android+JavaCameraView.java @@ -10,6 +10,7 @@ import android.hardware.Camera.PreviewCallback; import android.os.Build; import android.util.AttributeSet; import android.util.Log; +import android.view.ViewGroup.LayoutParams; import org.opencv.core.CvType; import org.opencv.core.Mat; @@ -130,6 +131,11 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb mFrameWidth = params.getPreviewSize().width; mFrameHeight = params.getPreviewSize().height; + if ((getLayoutParams().width == LayoutParams.MATCH_PARENT) && (getLayoutParams().height == LayoutParams.MATCH_PARENT)) + mScale = Math.min(((float)height)/mFrameHeight, ((float)width)/mFrameWidth); + else + mScale = 0; + if (mFpsMeter != null) { mFpsMeter.setResolution(mFrameWidth, mFrameHeight); } diff --git a/modules/java/generator/src/java/android+NativeCameraView.java b/modules/java/generator/src/java/android+NativeCameraView.java index 3802167b3..496ed53d6 100644 --- a/modules/java/generator/src/java/android+NativeCameraView.java +++ b/modules/java/generator/src/java/android+NativeCameraView.java @@ -8,6 +8,7 @@ import org.opencv.highgui.VideoCapture; import android.content.Context; import android.util.AttributeSet; import android.util.Log; +import android.view.ViewGroup.LayoutParams; /** * This class is an implementation of a bridge between SurfaceView and native OpenCV camera. @@ -102,6 +103,11 @@ public class NativeCameraView extends CameraBridgeViewBase { mFrameWidth = (int)frameSize.width; mFrameHeight = (int)frameSize.height; + if ((getLayoutParams().width == LayoutParams.MATCH_PARENT) && (getLayoutParams().height == LayoutParams.MATCH_PARENT)) + mScale = Math.min(((float)height)/mFrameHeight, ((float)width)/mFrameWidth); + else + mScale = 0; + if (mFpsMeter != null) { mFpsMeter.setResolution(mFrameWidth, mFrameHeight); } diff --git a/samples/android/tutorial-3-cameracontrol/res/layout/tutorial3_surface_view.xml b/samples/android/tutorial-3-cameracontrol/res/layout/tutorial3_surface_view.xml index 79fef4eae..a57490578 100644 --- a/samples/android/tutorial-3-cameracontrol/res/layout/tutorial3_surface_view.xml +++ b/samples/android/tutorial-3-cameracontrol/res/layout/tutorial3_surface_view.xml @@ -4,8 +4,8 @@ android:layout_height="match_parent" >