ZoomRenderer.java revision 4d628bcbaf4e6f2330dc9619f2129770863666dc
1/* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.camera.ui; 18 19import android.content.Context; 20import android.content.res.Resources; 21import android.graphics.Canvas; 22import android.graphics.Color; 23import android.graphics.Paint; 24import android.util.Log; 25import android.view.MotionEvent; 26import android.view.ScaleGestureDetector; 27 28import com.android.camera.R; 29 30public class ZoomRenderer extends OverlayRenderer 31 implements ScaleGestureDetector.OnScaleGestureListener { 32 33 private static final String TAG = "CAM_Zoom"; 34 35 private int mMaxZoom; 36 private int mZoom; 37 private OnZoomChangedListener mListener; 38 39 private ScaleGestureDetector mDetector; 40 private Paint mPaint; 41 private int mCircleSize; 42 private int mCenterX; 43 private int mCenterY; 44 private boolean mScaling; 45 private float mMaxCircle; 46 private float mMinCircle; 47 private float mScale = 1f; 48 private float mMinScale = 1f; 49 private float mMaxScale = 3f; 50 51 public interface OnZoomChangedListener { 52 void onZoomStart(); 53 void onZoomEnd(); 54 void onZoomValueChanged(int index); // only for immediate zoom 55 } 56 57 public ZoomRenderer(Context ctx) { 58 Resources res = ctx.getResources(); 59 mPaint = new Paint(); 60 mPaint.setAntiAlias(true); 61 mPaint.setColor(Color.WHITE); 62 mPaint.setStyle(Paint.Style.STROKE); 63 mPaint.setStrokeWidth(res.getDimensionPixelSize(R.dimen.focus_outer_stroke)); 64 mDetector = new ScaleGestureDetector(ctx, this); 65 mMinCircle = res.getDimensionPixelSize(R.dimen.zoom_ring_min); 66 } 67 68 // set from module 69 public void setZoomMax(int zoomMax) { 70 mMaxZoom = zoomMax; 71 } 72 73 // set from module 74 public void setZoomIndex(int index) { 75 mScale = (mMaxScale - mMinScale) * index / mMaxZoom + mMinScale; 76 mZoom = index; 77 } 78 79 public void setOnZoomChangeListener(OnZoomChangedListener listener) { 80 mListener = listener; 81 } 82 83 @Override 84 public void layout(int l, int t, int r, int b) { 85 super.layout(l, t, r, b); 86 mCenterX = (r - l) / 2; 87 mCenterY = (b - t) / 2; 88 mMaxCircle = Math.min(getWidth(), getHeight()); 89 mMaxCircle = (mMaxCircle - mMinCircle) / 2; 90 } 91 92 public boolean isScaling() { 93 return mDetector.isInProgress(); 94 } 95 96 @Override 97 public void onDraw(Canvas canvas) { 98 if (mScaling) { 99 canvas.drawCircle((float) mCenterX, (float) mCenterY, 100 (float) mCircleSize, mPaint); 101 } 102 } 103 104 @Override 105 public boolean onScale(ScaleGestureDetector detector) { 106 mScale = mScale * detector.getScaleFactor(); 107 if (mScale < 1) mScale = 1; 108 if (mScale > mMaxScale) mScale = mMaxScale; 109 int newzoom = (int) ((mScale - mMinScale) * mMaxZoom / (mMaxScale - mMinScale)); 110 if (newzoom > mMaxZoom) newzoom = mMaxZoom; 111 if (newzoom < 0) newzoom = 0; 112 if (mListener != null && newzoom != mZoom) { 113 mListener.onZoomValueChanged(newzoom); 114 mZoom = newzoom; 115 } 116 mCircleSize = (int) (mMinCircle + (mScale - mMinScale) * (mMaxCircle - mMinCircle) 117 / (mMaxScale - mMinScale)); 118 return true; 119 } 120 121 @Override 122 public boolean onScaleBegin(ScaleGestureDetector detector) { 123 mScaling = true; 124 if (mListener != null) { 125 mListener.onZoomStart(); 126 } 127 mOverlay.postInvalidate(); 128 return true; 129 } 130 131 @Override 132 public void onScaleEnd(ScaleGestureDetector detector) { 133 mScaling = false; 134 if (mListener != null) { 135 mListener.onZoomEnd(); 136 } 137 } 138 139} 140