diff options
author | Cheng-Ru Lin <owenlin@google.com> | 2009-09-28 03:21:25 +0800 |
---|---|---|
committer | Cheng-Ru Lin <owenlin@google.com> | 2009-09-29 02:46:29 +0800 |
commit | ffcca7403c9a364403357d3c76a3ff256c63c786 (patch) | |
tree | f76aaecf3228111063384b975eb50ce1d956c94b /src/com/android/camera/PreviewFrameLayout.java | |
parent | 2901711af18340c8cd255adb0aabbcd319b2dd95 (diff) | |
download | packages_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.java | 123 |
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); + } +} + |