18acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell/*
28acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * Copyright (C) 2008 The Android Open Source Project
38acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell *
48acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * Licensed under the Apache License, Version 2.0 (the "License");
58acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * you may not use this file except in compliance with the License.
68acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * You may obtain a copy of the License at
78acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell *
88acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell *      http://www.apache.org/licenses/LICENSE-2.0
98acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell *
108acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * Unless required by applicable law or agreed to in writing, software
118acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * distributed under the License is distributed on an "AS IS" BASIS,
128acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * See the License for the specific language governing permissions and
148acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell * limitations under the License.
158acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell */
168acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
178acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellpackage com.google.android.test.transform;
188acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
198acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.app.Activity;
208acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.content.Context;
218acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.graphics.Canvas;
228acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.graphics.Matrix;
238acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.graphics.drawable.Drawable;
248acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.os.Bundle;
258acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.util.DisplayMetrics;
268acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.util.Log;
278acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.view.MotionEvent;
28ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powellimport android.view.ScaleGestureDetector;
298acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.view.View;
308acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellimport android.widget.LinearLayout;
318acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
328acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powellpublic class TransformTestActivity extends Activity {
338acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    public TransformTestActivity() {
348acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        super();
358acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        init(false);
368acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    }
378acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
388acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    public TransformTestActivity(boolean noCompat) {
398acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        super();
408acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        init(noCompat);
418acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    }
428acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
438acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    public void init(boolean noCompat) {
448acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
458acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    }
468acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
478acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    @Override
488acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    protected void onCreate(Bundle savedInstanceState) {
498acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        super.onCreate(savedInstanceState);
508acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
518acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        this.setTitle(R.string.act_title);
528acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        LinearLayout root = new LinearLayout(this);
538acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        root.setOrientation(LinearLayout.VERTICAL);
548acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
558acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        TransformView view = new TransformView(getApplicationContext());
568acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        Drawable drawable = getResources().getDrawable(R.drawable.logo);
578acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicWidth());
588acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        view.setDrawable(drawable);
598acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
608acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        root.addView(view);
618acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        setContentView(root);
628acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    }
638acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
648acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    private class TransformView extends View {
658acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        private Drawable mDrawable;
668acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        private float mPosX;
678acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        private float mPosY;
688acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        private float mScale = 1.f;
698acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        private Matrix mMatrix;
70ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell        private ScaleGestureDetector mDetector;
71ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell
72ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell        private float mLastX;
73ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell        private float mLastY;
748acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
75ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell        private class Listener implements ScaleGestureDetector.OnScaleGestureListener {
768acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
77ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            public boolean onScale(ScaleGestureDetector detector) {
788acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                float scale = detector.getScaleFactor();
79ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell
808acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                Log.d("ttest", "Scale: " + scale);
81ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell
82ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                // Limit the scale so our object doesn't get too big or disappear
838acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                if (mScale * scale > 0.1f) {
848acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                    if (mScale * scale < 10.f) {
858acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                        mScale *= scale;
868acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                    } else {
878acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                        mScale = 10.f;
888acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                    }
898acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                } else {
908acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                    mScale = 0.1f;
918acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                }
928acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
938acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                Log.d("ttest", "mScale: " + mScale + " mPos: (" + mPosX + ", " + mPosY + ")");
948acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
958acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                float sizeX = mDrawable.getIntrinsicWidth()/2;
968acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                float sizeY = mDrawable.getIntrinsicHeight()/2;
97ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                float centerX = detector.getFocusX();
98ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                float centerY = detector.getFocusY();
998acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                float diffX = centerX - mPosX;
1008acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                float diffY = centerY - mPosY;
1018acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                diffX = diffX*scale - diffX;
1028acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                diffY = diffY*scale - diffY;
1038acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                mPosX -= diffX;
1048acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                mPosY -= diffY;
1058acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                mMatrix.reset();
1068acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                mMatrix.postTranslate(-sizeX, -sizeY);
1078acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                mMatrix.postScale(mScale, mScale);
1088acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                mMatrix.postTranslate(mPosX, mPosY);
1098acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
1108acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                invalidate();
1118acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
1128acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                return true;
1138acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            }
1148acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
115ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            public boolean onScaleBegin(ScaleGestureDetector detector) {
1168acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell                return true;
1178acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            }
1188acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
119ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            public void onScaleEnd(ScaleGestureDetector detector) {
120ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                mLastX = detector.getFocusX();
121ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                mLastY = detector.getFocusY();
122ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            }
1238acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        }
1248acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
1258acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        public TransformView(Context context) {
1268acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            super(context);
1278acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mMatrix = new Matrix();
128ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            mDetector = new ScaleGestureDetector(context, new Listener());
1298acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            DisplayMetrics metrics = context.getResources().getDisplayMetrics();
1308acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mPosX = metrics.widthPixels/2;
1318acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mPosY = metrics.heightPixels/2;
1328acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        }
1338acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
1348acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        public void setDrawable(Drawable d) {
1358acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mDrawable = d;
1368acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
1378acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            float sizeX = mDrawable.getIntrinsicWidth()/2;
1388acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            float sizeY = mDrawable.getIntrinsicHeight()/2;
1398acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mMatrix.reset();
1408acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mMatrix.postTranslate(-sizeX, -sizeY);
1418acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mMatrix.postScale(mScale, mScale);
1428acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mMatrix.postTranslate(mPosX, mPosY);
1438acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        }
1448acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
1458acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        @Override
1468acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        public boolean onTouchEvent(MotionEvent event) {
147ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            mDetector.onTouchEvent(event);
1488acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
149ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            // Handling single finger pan
150ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            if (!mDetector.isInProgress()) {
151ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                switch (event.getAction()) {
152ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                    case MotionEvent.ACTION_DOWN:
153ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mLastX = event.getX();
154ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mLastY = event.getY();
155ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        break;
156ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell
157ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                    case MotionEvent.ACTION_MOVE:
158ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        final float x = event.getX();
159ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        final float y = event.getY();
160ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mPosX += x - mLastX;
161ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mPosY += y - mLastY;
162ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mLastX = x;
163ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mLastY = y;
164ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell
165ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        float sizeX = mDrawable.getIntrinsicWidth()/2;
166ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        float sizeY = mDrawable.getIntrinsicHeight()/2;
167ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell
168ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mMatrix.reset();
169ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mMatrix.postTranslate(-sizeX, -sizeY);
170ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mMatrix.postScale(mScale, mScale);
171ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        mMatrix.postTranslate(mPosX, mPosY);
172ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        invalidate();
173ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                        break;
174ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell                }
175ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            }
1768acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
177ae542ff055301a4c3c8a18e8da1739df3a771958Adam Powell            return true;
1788acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        }
1798acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell
1808acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        @Override
1818acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        public void onDraw(Canvas canvas) {
1828acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            int saveCount = canvas.getSaveCount();
1838acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            canvas.save();
1848acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            canvas.concat(mMatrix);
1858acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            mDrawable.draw(canvas);
1868acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell            canvas.restoreToCount(saveCount);
1878acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell        }
1888acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell    }
1898acdb201bdad2cd03c07ebad9cda29f7971ed164Adam Powell}
190