ZoomRenderer.java revision 0f1cc66c395becb393ccd99d92475329bc6bdef5
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.view.ScaleGestureDetector; 25 26import com.android.camera.R; 27 28public class ZoomRenderer extends OverlayRenderer 29 implements ScaleGestureDetector.OnScaleGestureListener { 30 31 private static final String TAG = "CAM_Zoom"; 32 33 private int mMaxZoom; 34 private int mZoom; 35 private OnZoomChangedListener mListener; 36 37 private ScaleGestureDetector mDetector; 38 private Paint mPaint; 39 private int mCircleSize; 40 private int mCenterX; 41 private int mCenterY; 42 private float mMaxCircle; 43 private float mMinCircle; 44 private float mScale = 1f; 45 private float mMinScale = 1f; 46 private float mMaxScale = 3f; 47 private int mInnerStroke; 48 private int mOuterStroke; 49 50 public interface OnZoomChangedListener { 51 void onZoomStart(); 52 void onZoomEnd(); 53 void onZoomValueChanged(int index); // only for immediate zoom 54 } 55 56 public ZoomRenderer(Context ctx) { 57 Resources res = ctx.getResources(); 58 mPaint = new Paint(); 59 mPaint.setAntiAlias(true); 60 mPaint.setColor(Color.WHITE); 61 mPaint.setStyle(Paint.Style.STROKE); 62 mInnerStroke = res.getDimensionPixelSize(R.dimen.focus_inner_stroke); 63 mOuterStroke = res.getDimensionPixelSize(R.dimen.focus_outer_stroke); 64 mDetector = new ScaleGestureDetector(ctx, this); 65 mMinCircle = res.getDimensionPixelSize(R.dimen.zoom_ring_min); 66 setVisible(false); 67 } 68 69 // set from module 70 public void setZoomMax(int zoomMax) { 71 mMaxZoom = zoomMax; 72 } 73 74 // set from module 75 public void setZoomIndex(int index) { 76 mScale = (mMaxScale - mMinScale) * index / mMaxZoom + mMinScale; 77 mZoom = index; 78 } 79 80 public void setOnZoomChangeListener(OnZoomChangedListener listener) { 81 mListener = listener; 82 } 83 84 @Override 85 public void layout(int l, int t, int r, int b) { 86 super.layout(l, t, r, b); 87 mCenterX = (r - l) / 2; 88 mCenterY = (b - t) / 2; 89 mMaxCircle = Math.min(getWidth(), getHeight()); 90 mMaxCircle = (mMaxCircle - mMinCircle) / 2; 91 } 92 93 public boolean isScaling() { 94 return mDetector.isInProgress(); 95 } 96 97 @Override 98 public void onDraw(Canvas canvas) { 99 mPaint.setStrokeWidth(mInnerStroke); 100 canvas.drawCircle(mCenterX, mCenterY, mMinCircle, mPaint); 101 canvas.drawCircle(mCenterX, mCenterY, mMaxCircle, mPaint); 102 canvas.drawLine(mCenterX - mMinCircle, mCenterY, 103 mCenterX - mMaxCircle - 4, mCenterY, mPaint); 104 mPaint.setStrokeWidth(mOuterStroke); 105 canvas.drawCircle((float) mCenterX, (float) mCenterY, 106 (float) mCircleSize, mPaint); 107 } 108 109 @Override 110 public boolean onScale(ScaleGestureDetector detector) { 111 mScale = mScale * detector.getScaleFactor(); 112 if (mScale < 1) mScale = 1; 113 if (mScale > mMaxScale) mScale = mMaxScale; 114 int newzoom = (int) ((mScale - mMinScale) * mMaxZoom / (mMaxScale - mMinScale)); 115 if (newzoom > mMaxZoom) newzoom = mMaxZoom; 116 if (newzoom < 0) newzoom = 0; 117 if (mListener != null && newzoom != mZoom) { 118 mListener.onZoomValueChanged(newzoom); 119 mZoom = newzoom; 120 } 121 mCircleSize = (int) (mMinCircle + (mScale - mMinScale) * (mMaxCircle - mMinCircle) 122 / (mMaxScale - mMinScale)); 123 return true; 124 } 125 126 @Override 127 public boolean onScaleBegin(ScaleGestureDetector detector) { 128 setVisible(true); 129 if (mListener != null) { 130 mListener.onZoomStart(); 131 } 132 update(); 133 return true; 134 } 135 136 @Override 137 public void onScaleEnd(ScaleGestureDetector detector) { 138 setVisible(false); 139 if (mListener != null) { 140 mListener.onZoomEnd(); 141 } 142 } 143 144} 145