package com.android.mms.util; import android.util.FloatMath; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; public class ZoomViewUtil { private static final String TAG = "ZoomUtil"; private static final boolean DEBUG = true; private static final float MAX_TEXT_SIZE = 70.0f; private static final float MIN_TEXT_SIZE = 8.0f; private static final float STAND_MOVE = 4.0f; private static final int NONE = 0; private static final int DRAG = 1; private static final int ZOOM = 2; private static float mScale = 0.75f; private int mode = NONE; private float mDist; private float mTextSize; private TextResizeable mTR; public ZoomViewUtil(TextResizeable tr) { mTR = tr; } public void setView(View view, float size) { mTextSize = size; Log.d(TAG,"setView() init size:"+size); addViewTouchListener(view); } protected void addViewTouchListener(View view){ view.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (DEBUG) { Log.i(TAG, "onTouch event:" + event); } switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: if (!v.isLongClickable()) { v.setLongClickable(true); } mode = DRAG; break; case MotionEvent.ACTION_UP: mode = NONE; break; case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; case MotionEvent.ACTION_POINTER_DOWN: if (v.isLongClickable()) { v.setLongClickable(false); } mDist = calculateDist(event); if(mDist >= STAND_MOVE){ mode = ZOOM; } else { mode = DRAG; } return true; case MotionEvent.ACTION_MOVE: if(mode == ZOOM){ float newDist = calculateDist(event); if( newDist > mDist ) { zoomOut(); } else if( newDist < mDist ) { zoomIn(); } return true; } break; default: return false; } return false; } }); } protected void zoomIn(){ mTextSize -= mScale; if (mTextSize < MIN_TEXT_SIZE){ mTextSize = MIN_TEXT_SIZE; } mTR.onTextResize(mTextSize); if(DEBUG) Log.i(TAG, "zoomin:"+mTextSize); } protected void zoomOut() { mTextSize += mScale; if (mTextSize > MAX_TEXT_SIZE) { mTextSize = MAX_TEXT_SIZE; } mTR.onTextResize(mTextSize); if (DEBUG) { Log.i(TAG, "zoomout:" + mTextSize); } } protected float calculateDist(MotionEvent event){ float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } public interface TextResizeable { void onTextResize(float size); } }