diff options
Diffstat (limited to 'src/com/android/camera/ui')
-rw-r--r-- | src/com/android/camera/ui/CameraControls.java | 48 | ||||
-rw-r--r-- | src/com/android/camera/ui/HistogramView.java | 130 | ||||
-rw-r--r-- | src/com/android/camera/ui/RotatableLayout.java | 2 |
3 files changed, 173 insertions, 7 deletions
diff --git a/src/com/android/camera/ui/CameraControls.java b/src/com/android/camera/ui/CameraControls.java index f4449182b..adaf34271 100644 --- a/src/com/android/camera/ui/CameraControls.java +++ b/src/com/android/camera/ui/CameraControls.java @@ -37,6 +37,7 @@ import android.widget.TextView; import java.util.ArrayList; import org.codeaurora.snapcam.R; +import com.android.camera.CameraManager; import com.android.camera.ui.ModuleSwitcher; import com.android.camera.ui.RotateImageView; import com.android.camera.ShutterButton; @@ -55,6 +56,8 @@ public class CameraControls extends RotatableLayout { private View mPreview; private View mSceneModeSwitcher; private View mFilterModeSwitcher; + private View mAutoHdrNotice; + private HistogramView mHistogramView; private ArrowTextView mRefocusToast; private int mSize; @@ -194,10 +197,12 @@ public class CameraControls extends RotatableLayout { mFilterModeSwitcher = findViewById(R.id.filter_mode_switcher); mRemainingPhotos = (LinearLayout) findViewById(R.id.remaining_photos); mRemainingPhotosText = (TextView) findViewById(R.id.remaining_photos_text); + mAutoHdrNotice = (TextView) findViewById(R.id.auto_hdr_notice); + mHistogramView = (HistogramView) findViewById(R.id.histogram); mTopViews = new View[] { mSceneModeSwitcher, mFilterModeSwitcher, mHdrSwitcher, - mFrontBackSwitcher, mMenu + mFrontBackSwitcher, mMenu, mAutoHdrNotice, mHistogramView }; mBottomViews = new View[] { mPreview, mShutter, mSwitcher @@ -250,6 +255,13 @@ public class CameraControls extends RotatableLayout { asRow(true, w, h, rotation, mSceneModeSwitcher, mFilterModeSwitcher, mFrontBackSwitcher, mHdrSwitcher, mMenu); + center(mAutoHdrNotice, l, t + mSize, r, + t + mSize + mAutoHdrNotice.getMeasuredHeight(), + orientation, rotation, new Rect()); + center(mHistogramView, l, t + mSize, + r, t + mSize + mHistogramView.getMeasuredHeight(), + orientation, rotation, new Rect()); + Rect expandedShutter = new Rect(shutter); switch (rotation) { case 90: @@ -395,6 +407,10 @@ public class CameraControls extends RotatableLayout { v.layout(result.left, result.top, result.right, result.bottom); } + public void setAutoHdrEnabled(boolean enabled) { + mAutoHdrNotice.setVisibility(enabled ? View.VISIBLE : View.GONE); + } + public void hideUI() { if (!mAnimating) enableTouch(false); @@ -406,7 +422,17 @@ public class CameraControls extends RotatableLayout { mFrontBackSwitcher.animate().setListener(outlistener); ((ModuleSwitcher) mSwitcher).removePopup(); markVisibility(); - int topTranslation = rotation == 0 || rotation == 90 ? -mSize : mSize; + + // determine needed translation amount + int translation = 0; + for (View v : mTopViews) { + translation = Math.max(translation, v.getBottom()); + } + for (View v : mBottomViews) { + translation = Math.max(translation, getHeight() - v.getTop()); + } + + int topTranslation = rotation == 0 || rotation == 90 ? -translation : translation; boolean isYTranslation = rotation == 0 || rotation == 180; animateViews(topTranslation, isYTranslation); //mRemainingPhotos.getVisibility(View.INVISIBLE); @@ -422,9 +448,9 @@ public class CameraControls extends RotatableLayout { for (View v : views) { ViewPropertyAnimator vpa = v.animate(); if (isYTranslation) { - vpa.translationYBy(translation); + vpa.translationY(translation); } else { - vpa.translationXBy(translation); + vpa.translationX(translation); } vpa.setDuration(ANIME_DURATION); } @@ -451,9 +477,8 @@ public class CameraControls extends RotatableLayout { mPreview.setVisibility(View.VISIBLE); mFrontBackSwitcher.animate().setListener(inlistener); - int topTranslation = rotation == 0 || rotation == 90 ? mSize : -mSize; boolean isYTranslation = rotation == 0 || rotation == 180; - animateViews(topTranslation, isYTranslation); + animateViews(0, isYTranslation); /*if (mRemainingPhotos.getVisibility() == View.INVISIBLE) { mRemainingPhotos.setVisibility(View.VISIBLE); }*/ @@ -671,11 +696,22 @@ public class CameraControls extends RotatableLayout { mRemainingPhotos.setVisibility(show ? View.GONE : View.VISIBLE); } + public void setHistogramEnabled(boolean enabled, CameraManager.CameraProxy camera) { + mHistogramView.setVisibility(enabled ? View.VISIBLE : View.GONE); + mHistogramView.setCamera(camera); + } + + public void updateHistogramData(int[] data) { + mHistogramView.updateData(data); + } + public void setOrientation(int orientation, boolean animation) { mOrientation = orientation; for (View v : mAllViews) { if (v instanceof RotateImageView) { ((RotateImageView) v).setOrientation(orientation, animation); + } else if (v instanceof HistogramView) { + ((HistogramView) v).setRotation(-orientation); } } layoutRemaingPhotos(); diff --git a/src/com/android/camera/ui/HistogramView.java b/src/com/android/camera/ui/HistogramView.java new file mode 100644 index 000000000..2ae2c40a8 --- /dev/null +++ b/src/com/android/camera/ui/HistogramView.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * Copyright (C) 2013-2015 The CyanogenMod 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.ui; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; + +import com.android.camera.CameraManager; + +public class HistogramView extends View { + private static final int STATS_SIZE = 256; + + private int[] mData = new int[STATS_SIZE + 1]; + private boolean mDataValid; + + private Bitmap mBitmap; + private Paint mPaint = new Paint(); + private Paint mPaintRect = new Paint(); + private Canvas mCanvas = new Canvas(); + private float mWidth; + private float mHeight; + private CameraManager.CameraProxy mGraphCameraDevice; + + public HistogramView(Context context, AttributeSet attrs) { + super(context,attrs); + + mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); + mPaintRect.setColor(0xFFFFFFFF); + mPaintRect.setStyle(Paint.Style.FILL); + } + + public void setCamera(CameraManager.CameraProxy camera) { + mGraphCameraDevice = camera; + if (camera == null) { + mDataValid = false; + } + } + + public void updateData(int[] data) { + if (data.length == mData.length) { + System.arraycopy(data, 0, mData, 0, data.length); + drawGraph(); + mDataValid = true; + invalidate(); + } + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565); + mCanvas.setBitmap(mBitmap); + mWidth = w; + mHeight = h; + if (mDataValid) { + drawGraph(); + } + super.onSizeChanged(w, h, oldw, oldh); + } + + @Override + protected void onDraw(Canvas canvas) { + if (mDataValid && mBitmap != null) { + canvas.drawBitmap(mBitmap, 0, 0, null); + if (mGraphCameraDevice != null) { + mGraphCameraDevice.sendHistogramData(); + } + } + } + + private void drawGraph() { + final float border = 5; + float graphheight = mHeight - (2 * border); + float graphwidth = mWidth - (2 * border); + float bargap = 0.0f; + float barwidth = graphwidth/STATS_SIZE; + + mCanvas.drawColor(0xFFAAAAAA); + mPaint.setColor(Color.BLACK); + + for (int k = 0; k <= (graphheight /32) ; k++) { + float y = (float)(32 * k)+ border; + mCanvas.drawLine(border, y, graphwidth + border , y, mPaint); + } + for (int j = 0; j <= (graphwidth /32); j++) { + float x = (float)(32 * j)+ border; + mCanvas.drawLine(x, border, x, graphheight + border, mPaint); + } + + //Assumption: The first element contains the maximum value. + int maxValue = Integer.MIN_VALUE; + if (mData[0] == 0) { + for (int i = 1; i <= STATS_SIZE ; i++) { + maxValue = Math.max(maxValue, mData[i]); + } + } else { + maxValue = mData[0]; + } + + for (int i = 1; i <= STATS_SIZE; i++) { + float scaled = Math.min(STATS_SIZE, + (float) mData[i] * (float) STATS_SIZE / (float) maxValue); + float left = (bargap * (i+1)) + (barwidth * i) + border; + float top = graphheight + border; + float right = left + barwidth; + float bottom = top - scaled; + mCanvas.drawRect(left, top, right, bottom, mPaintRect); + } + } +} + diff --git a/src/com/android/camera/ui/RotatableLayout.java b/src/com/android/camera/ui/RotatableLayout.java index 6867e6a8b..702590f9f 100644 --- a/src/com/android/camera/ui/RotatableLayout.java +++ b/src/com/android/camera/ui/RotatableLayout.java @@ -280,4 +280,4 @@ public class RotatableLayout extends FrameLayout { rotateClockwise(view); rotateClockwise(view); } -}
\ No newline at end of file +} |