SliderController.java revision 02f778af1f8a2250d91da450f82c30572de96062
1
2package com.android.gallery3d.filtershow.ui;
3
4import android.graphics.Canvas;
5import android.graphics.Paint;
6import android.view.MotionEvent;
7
8import android.util.Log;
9
10public class SliderController {
11    private static final String LOGTAG = "SliderController";
12
13    private float mCenterX;
14    private float mCenterY;
15    private float mCurrentX;
16    private float mCurrentY;
17    private int mValue = 100;
18    int mOriginalValue = 0;
19
20    private int mWidth = 0;
21    private int mHeight = 0;
22
23    private String mToast = null;
24
25    private Paint mPaint = new Paint();
26
27    private SliderListener mListener = null;
28
29    private MODES mMode = MODES.NONE;
30    private static int mTextSize = 128;
31
32    private enum MODES {
33        NONE, DOWN, UP, MOVE
34    }
35
36    public void onDraw(Canvas canvas) {
37        if (mMode == MODES.NONE || mMode == MODES.UP) {
38            return;
39        }
40        drawToast(canvas);
41    }
42
43    public void drawToast(Canvas canvas) {
44        if (mToast != null) {
45            canvas.save();
46            mPaint.setTextSize(mTextSize);
47            float textWidth = mPaint.measureText(mToast);
48            int toastX = (int) ((getWidth() - textWidth) / 2.0f);
49            int toastY = (int) (getHeight() / 3.0f);
50
51            mPaint.setARGB(255, 0, 0, 0);
52            canvas.drawText(mToast, toastX - 2, toastY - 2, mPaint);
53            canvas.drawText(mToast, toastX - 2, toastY, mPaint);
54            canvas.drawText(mToast, toastX, toastY - 2, mPaint);
55            canvas.drawText(mToast, toastX + 2, toastY + 2, mPaint);
56            canvas.drawText(mToast, toastX + 2, toastY, mPaint);
57            canvas.drawText(mToast, toastX, toastY + 2, mPaint);
58            mPaint.setARGB(255, 255, 255, 255);
59            canvas.drawText(mToast, toastX, toastY, mPaint);
60            canvas.restore();
61        }
62    }
63
64    protected int computeValue() {
65        int delta = (int) (100 * (getCurrentX() - getCenterX()) / (float) getWidth());
66        int value = mOriginalValue + delta;
67        value = Math.max(0, Math.min(value, 100));
68        setValue(value);
69        mToast = "" + value;
70        return value;
71    }
72
73    public void setValue(int value) {
74        mValue = value;
75    }
76
77    public int getWidth() {
78        return mWidth;
79    }
80
81    public int getHeight() {
82        return mHeight;
83    }
84
85    public void setWidth(int value) {
86        mWidth = value;
87    }
88
89    public void setHeight(int value) {
90        mHeight = value;
91    }
92
93    public float getCurrentX() {
94        return mCurrentX;
95    }
96
97    public float getCurrentY() {
98        return mCurrentY;
99    }
100
101    public float getCenterX() {
102        return mCenterX;
103    }
104
105    public float getCenterY() {
106        return mCenterY;
107    }
108
109    public void setActionDown(float x, float y) {
110        mCenterX = x;
111        mCenterY = y;
112        mCurrentX = x;
113        mCurrentY = y;
114        mMode = MODES.DOWN;
115    }
116
117    public void setActionMove(float x, float y) {
118        mCurrentX = x;
119        mCurrentY = y;
120        mMode = MODES.MOVE;
121        computeValue();
122        if (mListener != null) {
123            mListener.onNewValue(mValue);
124        }
125    }
126
127    public void setActionUp() {
128        mMode = MODES.UP;
129        mOriginalValue = computeValue();
130    }
131
132    public void setNoAction() {
133        mMode = MODES.NONE;
134    }
135
136    public void setListener(SliderListener listener) {
137        mListener = listener;
138    }
139
140    public boolean onTouchEvent(MotionEvent event) {
141        setNoAction();
142        switch (event.getActionMasked()) {
143            case (MotionEvent.ACTION_DOWN): {
144                setActionDown(event.getX(), event.getY());
145                break;
146            }
147            case (MotionEvent.ACTION_UP): {
148                setActionUp();
149                break;
150            }
151            case (MotionEvent.ACTION_CANCEL): {
152                setActionUp();
153                break;
154            }
155            case (MotionEvent.ACTION_MOVE): {
156                setActionMove(event.getX(), event.getY());
157                break;
158            }
159        }
160        return true;
161    }
162
163}
164