summaryrefslogtreecommitdiffstats
path: root/src/com/android/camera/panorama/CaptureView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/camera/panorama/CaptureView.java')
-rw-r--r--src/com/android/camera/panorama/CaptureView.java131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/com/android/camera/panorama/CaptureView.java b/src/com/android/camera/panorama/CaptureView.java
new file mode 100644
index 0000000..3351527
--- /dev/null
+++ b/src/com/android/camera/panorama/CaptureView.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2011 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.panorama;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+import android.graphics.RectF;
+import android.graphics.Typeface;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+
+class CaptureView extends View {
+ private static final String TAG = "CaptureView";
+
+ private Canvas mCanvas;
+ private Bitmap mCanvasBitmap;
+ private String mStatusText = "";
+ private int mStartAngle = 0;
+ private int mSweepAngle = 0;
+ private int mWidth;
+ private int mHeight;
+ private Bitmap mBitmap = null;
+ private Matrix mM = null;
+ private Matrix mMLast = null;
+ private final Paint mPaint = new Paint();
+ // Origin of the coordinate for appending a new alpha bitmap.
+ // mCanvasBitmap is 2000x2000, but the origin is set to (800, 800).
+ // All the alpha bitmaps grow from this origin.
+ float mAlphaOriginX;
+ float mAlphaOriginY;
+
+
+ public CaptureView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mM = new Matrix();
+ mMLast = new Matrix();
+ mMLast.reset();
+ mPaint.setStyle(Paint.Style.FILL);
+ mPaint.setColor(Color.RED);
+ mPaint.setAntiAlias(true);
+ mPaint.setTextSize(40);
+ mPaint.setTypeface(Typeface.create((Typeface) null, Typeface.BOLD));
+ mPaint.setTextAlign(Align.CENTER);
+ }
+
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ if (mCanvasBitmap != null) {
+ mCanvasBitmap.recycle();
+ }
+ Log.v(TAG, "onSizeChanged: W = " + w + ", H = " + h);
+ // TODO: 2000x2000 is a temporary setting from SRI's code. Should be fixed once the code is
+ // refactored.
+ mCanvasBitmap = Bitmap.createBitmap(2000, 2000, Bitmap.Config.ARGB_8888);
+ mCanvas = new Canvas();
+ mCanvas.setBitmap(mCanvasBitmap);
+ mAlphaOriginX = mCanvasBitmap.getWidth() * 0.4f;
+ mAlphaOriginY = mCanvasBitmap.getHeight() * 0.4f;
+ }
+
+ public void destroy() {
+ if (mCanvasBitmap != null) {
+ mCanvasBitmap.recycle();
+ }
+ }
+
+ public void setStartAngle(int angle) {
+ mStartAngle = angle;
+ }
+
+ public void setSweepAngle(int angle) {
+ mSweepAngle = angle;
+ }
+
+ public void setStatusText(String text) {
+ mStatusText = text;
+ }
+
+ public void setBitmap(Bitmap bitmap, Matrix m) {
+ mBitmap = bitmap;
+ mM = m;
+ }
+
+ public void setBitmap(Bitmap bitmap) {
+ mBitmap = bitmap;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ mWidth = getWidth();
+ mHeight = getHeight();
+
+ // Draw bitmaps according to the calculated panorama transformation.
+ if (mBitmap != null) {
+ mM.postTranslate(mAlphaOriginX, mAlphaOriginY);
+ mCanvas.drawBitmap(mBitmap, mM, mPaint);
+
+ Matrix mInverse = mM;
+ mM.invert(mInverse);
+ mInverse.postTranslate(mWidth / 2 - mBitmap.getWidth() / 2,
+ mHeight / 2 - mBitmap.getHeight() / 2);
+
+ canvas.drawBitmap(mCanvasBitmap, mInverse, mPaint);
+
+ RectF rect = new RectF(mWidth / 2 - 100, 3 * mHeight / 4,
+ mWidth / 2 + 100, 3 * mHeight / 4 + 200);
+ canvas.drawText(mStatusText, mWidth / 2, mHeight / 2, mPaint);
+ canvas.drawArc(rect, -90 + mStartAngle, mSweepAngle, true, mPaint);
+ canvas.drawArc(rect, -90 - mStartAngle, mSweepAngle > 0 ? 2 : 0, true, mPaint);
+ }
+ }
+}