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