summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/PreviewFrameLayout.java
diff options
context:
space:
mode:
authorCheng-Ru Lin <owenlin@google.com>2009-09-28 03:21:25 +0800
committerCheng-Ru Lin <owenlin@google.com>2009-09-29 02:46:29 +0800
commitffcca7403c9a364403357d3c76a3ff256c63c786 (patch)
treef76aaecf3228111063384b975eb50ce1d956c94b /src/com/android/camera/PreviewFrameLayout.java
parent2901711af18340c8cd255adb0aabbcd319b2dd95 (diff)
downloadpackages_apps_LegacyCamera-ffcca7403c9a364403357d3c76a3ff256c63c786.zip
packages_apps_LegacyCamera-ffcca7403c9a364403357d3c76a3ff256c63c786.tar.gz
packages_apps_LegacyCamera-ffcca7403c9a364403357d3c76a3ff256c63c786.tar.bz2
Resize the preview frame as large as possible.
Now, we will calculate the layout by ourselves in PreviewFrameLayout. Change-Id: I90f91f9df6d2f75fbd31fc930af624a84820bc95
Diffstat (limited to 'src/com/android/camera/PreviewFrameLayout.java')
-rw-r--r--src/com/android/camera/PreviewFrameLayout.java123
1 files changed, 123 insertions, 0 deletions
diff --git a/src/com/android/camera/PreviewFrameLayout.java b/src/com/android/camera/PreviewFrameLayout.java
new file mode 100644
index 0000000..c8af838
--- /dev/null
+++ b/src/com/android/camera/PreviewFrameLayout.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.FrameLayout;
+
+public class PreviewFrameLayout extends ViewGroup {
+ private double mAspectRatio = 4.0 / 3.0;
+ private ImageView mGripper;
+ private FrameLayout mFrame;
+
+ public PreviewFrameLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ mGripper = (ImageView) findViewById(R.id.btn_gripper);
+ mFrame = (FrameLayout) findViewById(R.id.frame);
+ if (mFrame == null) {
+ throw new IllegalStateException(
+ "must provide child with id as \"frame\"");
+ }
+ }
+
+ public void setAspectRatio(double ratio) {
+ if (ratio <= 0.0) throw new IllegalArgumentException();
+
+ if (mAspectRatio != ratio) {
+ mAspectRatio = ratio;
+ requestLayout();
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ int gripperWidth = 0;
+ int gripperHeight = 0;
+
+ if (mGripper != null) {
+ measureChild(mGripper, widthMeasureSpec, heightMeasureSpec);
+ gripperWidth = mGripper.getMeasuredWidth();
+ gripperHeight = mGripper.getMeasuredHeight();
+ }
+
+ int frameWidth = getMeasuredWidth() - gripperWidth;
+ int frameHeight = getMeasuredHeight();
+
+ FrameLayout f = mFrame;
+
+ int horizontalPadding = f.getPaddingLeft() + f.getPaddingRight();
+ int verticalPadding = f.getPaddingBottom() + f.getPaddingTop();
+
+ int previewWidth = frameWidth - horizontalPadding;
+ int previewHeight = frameHeight - verticalPadding;
+
+ // resize frame and preview for aspect ratio
+ if (previewWidth > previewHeight * mAspectRatio) {
+ previewWidth = (int) (previewHeight * mAspectRatio + .5);
+ } else {
+ previewHeight = (int) (previewWidth / mAspectRatio + .5);
+ }
+ frameWidth = previewWidth + horizontalPadding;
+ frameHeight = previewHeight + verticalPadding;
+
+ measureChild(mFrame,
+ MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY, frameWidth),
+ MeasureSpec.makeMeasureSpec(MeasureSpec.EXACTLY, frameHeight));
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ // Try to layout the "frame" in the center of the area, and put
+ // "gripper" just to the left of it. If there is no enough space for
+ // the gripper, the "frame" will be moved a little right so that
+ // they won't overlap with each other.
+
+ int frameWidth = mFrame.getMeasuredWidth();
+ int frameHeight = mFrame.getMeasuredHeight();
+
+ int leftSpace = ((r - l) - frameWidth) / 2;
+ int topSpace = ((b - t) - frameHeight) / 2;
+
+ int gripperWidth = 0;
+ int gripperHeight = 0;
+ if (mGripper != null) {
+ gripperWidth = mGripper.getMeasuredWidth();
+ gripperHeight = mGripper.getMeasuredHeight();
+ myLayoutChild(mGripper,
+ Math.max(l, l + (leftSpace - gripperWidth)),
+ t + ((b - t) - gripperHeight) / 2,
+ gripperWidth, gripperHeight);
+ }
+ myLayoutChild(mFrame, Math.max(l + leftSpace, l + gripperWidth),
+ t + topSpace, frameWidth, frameHeight);
+ }
+
+ private static void myLayoutChild(View child, int l, int t, int w, int h) {
+ child.layout(l, t, l + w, t + h);
+ }
+}
+