/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.android.test.transform; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.View; import android.widget.LinearLayout; public class TransformTestActivity extends Activity { public TransformTestActivity() { super(); init(false); } public TransformTestActivity(boolean noCompat) { super(); init(noCompat); } public void init(boolean noCompat) { } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setTitle(R.string.act_title); LinearLayout root = new LinearLayout(this); root.setOrientation(LinearLayout.VERTICAL); TransformView view = new TransformView(getApplicationContext()); Drawable drawable = getResources().getDrawable(R.drawable.logo); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicWidth()); view.setDrawable(drawable); root.addView(view); setContentView(root); } private class TransformView extends View { private Drawable mDrawable; private float mPosX; private float mPosY; private float mScale = 1.f; private Matrix mMatrix; private ScaleGestureDetector mDetector; private float mLastX; private float mLastY; private class Listener implements ScaleGestureDetector.OnScaleGestureListener { public boolean onScale(ScaleGestureDetector detector) { float scale = detector.getScaleFactor(); Log.d("ttest", "Scale: " + scale); // Limit the scale so our object doesn't get too big or disappear if (mScale * scale > 0.1f) { if (mScale * scale < 10.f) { mScale *= scale; } else { mScale = 10.f; } } else { mScale = 0.1f; } Log.d("ttest", "mScale: " + mScale + " mPos: (" + mPosX + ", " + mPosY + ")"); float sizeX = mDrawable.getIntrinsicWidth()/2; float sizeY = mDrawable.getIntrinsicHeight()/2; float centerX = detector.getFocusX(); float centerY = detector.getFocusY(); float diffX = centerX - mPosX; float diffY = centerY - mPosY; diffX = diffX*scale - diffX; diffY = diffY*scale - diffY; mPosX -= diffX; mPosY -= diffY; mMatrix.reset(); mMatrix.postTranslate(-sizeX, -sizeY); mMatrix.postScale(mScale, mScale); mMatrix.postTranslate(mPosX, mPosY); invalidate(); return true; } public boolean onScaleBegin(ScaleGestureDetector detector) { return true; } public void onScaleEnd(ScaleGestureDetector detector) { mLastX = detector.getFocusX(); mLastY = detector.getFocusY(); } } public TransformView(Context context) { super(context); mMatrix = new Matrix(); mDetector = new ScaleGestureDetector(context, new Listener()); DisplayMetrics metrics = context.getResources().getDisplayMetrics(); mPosX = metrics.widthPixels/2; mPosY = metrics.heightPixels/2; } public void setDrawable(Drawable d) { mDrawable = d; float sizeX = mDrawable.getIntrinsicWidth()/2; float sizeY = mDrawable.getIntrinsicHeight()/2; mMatrix.reset(); mMatrix.postTranslate(-sizeX, -sizeY); mMatrix.postScale(mScale, mScale); mMatrix.postTranslate(mPosX, mPosY); } @Override public boolean onTouchEvent(MotionEvent event) { mDetector.onTouchEvent(event); // Handling single finger pan if (!mDetector.isInProgress()) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mLastX = event.getX(); mLastY = event.getY(); break; case MotionEvent.ACTION_MOVE: final float x = event.getX(); final float y = event.getY(); mPosX += x - mLastX; mPosY += y - mLastY; mLastX = x; mLastY = y; float sizeX = mDrawable.getIntrinsicWidth()/2; float sizeY = mDrawable.getIntrinsicHeight()/2; mMatrix.reset(); mMatrix.postTranslate(-sizeX, -sizeY); mMatrix.postScale(mScale, mScale); mMatrix.postTranslate(mPosX, mPosY); invalidate(); break; } } return true; } @Override public void onDraw(Canvas canvas) { int saveCount = canvas.getSaveCount(); canvas.save(); canvas.concat(mMatrix); mDrawable.draw(canvas); canvas.restoreToCount(saveCount); } } }