diff options
Diffstat (limited to 'src/com/android/camera/panorama/CaptureView.java')
-rw-r--r-- | src/com/android/camera/panorama/CaptureView.java | 131 |
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); + } + } +} |