blob: 8dfb3660b4b4be88dd8e8b2e9d87131236592250 [file] [log] [blame]
Angus Konged15d1a2013-08-19 15:06:12 -07001/*
2 * Copyright (C) 2011 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;
18
19import android.content.Context;
20import android.graphics.Canvas;
21import android.graphics.Paint;
22import android.graphics.RectF;
23import android.util.AttributeSet;
24import android.widget.ImageView;
25
26class PanoProgressBar extends ImageView {
27 @SuppressWarnings("unused")
28 private static final String TAG = "PanoProgressBar";
29 public static final int DIRECTION_NONE = 0;
30 public static final int DIRECTION_LEFT = 1;
31 public static final int DIRECTION_RIGHT = 2;
32 private float mProgress = 0;
33 private float mMaxProgress = 0;
34 private float mLeftMostProgress = 0;
35 private float mRightMostProgress = 0;
36 private float mProgressOffset = 0;
37 private float mIndicatorWidth = 0;
38 private int mDirection = 0;
39 private final Paint mBackgroundPaint = new Paint();
40 private final Paint mDoneAreaPaint = new Paint();
41 private final Paint mIndicatorPaint = new Paint();
42 private float mWidth;
43 private float mHeight;
44 private RectF mDrawBounds;
45 private OnDirectionChangeListener mListener = null;
46
47 public interface OnDirectionChangeListener {
48 public void onDirectionChange(int direction);
49 }
50
51 public PanoProgressBar(Context context, AttributeSet attrs) {
52 super(context, attrs);
53 mDoneAreaPaint.setStyle(Paint.Style.FILL);
54 mDoneAreaPaint.setAlpha(0xff);
55
56 mBackgroundPaint.setStyle(Paint.Style.FILL);
57 mBackgroundPaint.setAlpha(0xff);
58
59 mIndicatorPaint.setStyle(Paint.Style.FILL);
60 mIndicatorPaint.setAlpha(0xff);
61
62 mDrawBounds = new RectF();
63 }
64
65 public void setOnDirectionChangeListener(OnDirectionChangeListener l) {
66 mListener = l;
67 }
68
69 private void setDirection(int direction) {
70 if (mDirection != direction) {
71 mDirection = direction;
72 if (mListener != null) {
73 mListener.onDirectionChange(mDirection);
74 }
75 invalidate();
76 }
77 }
78
79 public int getDirection() {
80 return mDirection;
81 }
82
83 @Override
84 public void setBackgroundColor(int color) {
85 mBackgroundPaint.setColor(color);
86 invalidate();
87 }
88
89 public void setDoneColor(int color) {
90 mDoneAreaPaint.setColor(color);
91 invalidate();
92 }
93
94 public void setIndicatorColor(int color) {
95 mIndicatorPaint.setColor(color);
96 invalidate();
97 }
98
99 @Override
100 protected void onSizeChanged(int w, int h, int oldw, int oldh) {
101 mWidth = w;
102 mHeight = h;
103 mDrawBounds.set(0, 0, mWidth, mHeight);
104 }
105
106 public void setMaxProgress(int progress) {
107 mMaxProgress = progress;
108 }
109
110 public void setIndicatorWidth(float w) {
111 mIndicatorWidth = w;
112 invalidate();
113 }
114
115 public void setRightIncreasing(boolean rightIncreasing) {
116 if (rightIncreasing) {
117 mLeftMostProgress = 0;
118 mRightMostProgress = 0;
119 mProgressOffset = 0;
120 setDirection(DIRECTION_RIGHT);
121 } else {
122 mLeftMostProgress = mWidth;
123 mRightMostProgress = mWidth;
124 mProgressOffset = mWidth;
125 setDirection(DIRECTION_LEFT);
126 }
127 invalidate();
128 }
129
130 public void setProgress(int progress) {
131 // The panning direction will be decided after user pan more than 10 degrees in one
132 // direction.
133 if (mDirection == DIRECTION_NONE) {
134 if (progress > 10) {
135 setRightIncreasing(true);
136 } else if (progress < -10) {
137 setRightIncreasing(false);
138 }
139 }
140 // mDirection might be modified by setRightIncreasing() above. Need to check again.
141 if (mDirection != DIRECTION_NONE) {
142 mProgress = progress * mWidth / mMaxProgress + mProgressOffset;
143 // value bounds.
144 mProgress = Math.min(mWidth, Math.max(0, mProgress));
145 if (mDirection == DIRECTION_RIGHT) {
146 // The right most progress is adjusted.
147 mRightMostProgress = Math.max(mRightMostProgress, mProgress);
148 }
149 if (mDirection == DIRECTION_LEFT) {
150 // The left most progress is adjusted.
151 mLeftMostProgress = Math.min(mLeftMostProgress, mProgress);
152 }
153 invalidate();
154 }
155 }
156
157 public void reset() {
158 mProgress = 0;
159 mProgressOffset = 0;
160 setDirection(DIRECTION_NONE);
161 invalidate();
162 }
163
164 @Override
165 protected void onDraw(Canvas canvas) {
166 // the background
167 canvas.drawRect(mDrawBounds, mBackgroundPaint);
168 if (mDirection != DIRECTION_NONE) {
169 // the progress area
170 canvas.drawRect(mLeftMostProgress, mDrawBounds.top, mRightMostProgress,
171 mDrawBounds.bottom, mDoneAreaPaint);
172 // the indication bar
173 float l;
174 float r;
175 if (mDirection == DIRECTION_RIGHT) {
176 l = Math.max(mProgress - mIndicatorWidth, 0f);
177 r = mProgress;
178 } else {
179 l = mProgress;
180 r = Math.min(mProgress + mIndicatorWidth, mWidth);
181 }
182 canvas.drawRect(l, mDrawBounds.top, r, mDrawBounds.bottom, mIndicatorPaint);
183 }
184
185 // draw the mask image on the top for shaping.
186 super.onDraw(canvas);
187 }
188}