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