use of android.view.ScaleGestureDetector in project wechat by motianhuo.
the class TouchImageView method init.
protected void init() {
mTimerHandler = new TimeHandler(this);
matrix.setTranslate(1f, 1f);
m = new float[9];
setImageMatrix(matrix);
setScaleType(ScaleType.MATRIX);
if (Build.VERSION.SDK_INT >= 8) {
mScaleDetector = new ScaleGestureDetector(mContext, new ScaleListener());
}
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent rawEvent) {
WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
if (mScaleDetector != null) {
((ScaleGestureDetector) mScaleDetector).onTouchEvent(rawEvent);
}
fillMatrixXY();
PointF curr = new PointF(event.getX(), event.getY());
switch(event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
allowInert = false;
savedMatrix.set(matrix);
last.set(event.getX(), event.getY());
start.set(last);
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
// Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
// Log.d(TAG, "mode=ZOOM");
}
break;
case MotionEvent.ACTION_UP:
allowInert = true;
mode = NONE;
int xDiff = (int) Math.abs(event.getX() - start.x);
int yDiff = (int) Math.abs(event.getY() - start.y);
if (xDiff < CLICK && yDiff < CLICK) {
// Perform scale on double click
long pressTime = System.currentTimeMillis();
if (pressTime - lastPressTime <= DOUBLE_PRESS_INTERVAL) {
if (mClickTimer != null)
mClickTimer.cancel();
if (saveScale == 1) {
final float targetScale = maxScale / saveScale;
matrix.postScale(targetScale, targetScale, start.x, start.y);
saveScale = maxScale;
} else {
matrix.postScale(minScale / saveScale, minScale / saveScale, width / 2, height / 2);
saveScale = minScale;
}
calcPadding();
checkAndSetTranslate(0, 0);
lastPressTime = 0;
} else {
lastPressTime = pressTime;
mClickTimer = new Timer();
mClickTimer.schedule(new Task(), 300);
}
if (saveScale == minScale) {
scaleMatrixToBounds();
}
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
velocity = 0;
savedMatrix.set(matrix);
oldDist = spacing(event);
// Log.d(TAG, "mode=NONE");
break;
case MotionEvent.ACTION_MOVE:
allowInert = false;
if (mode == DRAG) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
long dragTime = System.currentTimeMillis();
velocity = (float) distanceBetween(curr, last) / (dragTime - lastDragTime) * FRICTION;
lastDragTime = dragTime;
checkAndSetTranslate(deltaX, deltaY);
lastDelta.set(deltaX, deltaY);
last.set(curr.x, curr.y);
} else if (mScaleDetector == null && mode == ZOOM) {
float newDist = spacing(event);
if (rawEvent.getPointerCount() < 2)
break;
// Magic number 50 for this case
if (10 > Math.abs(oldDist - newDist) || Math.abs(oldDist - newDist) > 50)
break;
float mScaleFactor = newDist / oldDist;
oldDist = newDist;
float origScale = saveScale;
saveScale *= mScaleFactor;
if (saveScale > maxScale) {
saveScale = maxScale;
mScaleFactor = maxScale / origScale;
} else if (saveScale < minScale) {
saveScale = minScale;
mScaleFactor = minScale / origScale;
}
calcPadding();
if (origWidth * saveScale <= width || origHeight * saveScale <= height) {
matrix.postScale(mScaleFactor, mScaleFactor, width / 2, height / 2);
if (mScaleFactor < 1) {
fillMatrixXY();
if (mScaleFactor < 1) {
scaleMatrixToBounds();
}
}
} else {
PointF mid = midPointF(event);
matrix.postScale(mScaleFactor, mScaleFactor, mid.x, mid.y);
fillMatrixXY();
if (mScaleFactor < 1) {
if (matrixX < -right)
matrix.postTranslate(-(matrixX + right), 0);
else if (matrixX > 0)
matrix.postTranslate(-matrixX, 0);
if (matrixY < -bottom)
matrix.postTranslate(0, -(matrixY + bottom));
else if (matrixY > 0)
matrix.postTranslate(0, -matrixY);
}
}
checkSiding();
}
break;
}
setImageMatrix(matrix);
invalidate();
return false;
}
});
}
use of android.view.ScaleGestureDetector in project android_frameworks_base by AOSPA.
the class OverlayDisplayWindow method createWindow.
private void createWindow() {
LayoutInflater inflater = LayoutInflater.from(mContext);
mWindowContent = inflater.inflate(com.android.internal.R.layout.overlay_display_window, null);
mWindowContent.setOnTouchListener(mOnTouchListener);
mTextureView = (TextureView) mWindowContent.findViewById(com.android.internal.R.id.overlay_display_window_texture);
mTextureView.setPivotX(0);
mTextureView.setPivotY(0);
mTextureView.getLayoutParams().width = mWidth;
mTextureView.getLayoutParams().height = mHeight;
mTextureView.setOpaque(false);
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
mTitleTextView = (TextView) mWindowContent.findViewById(com.android.internal.R.id.overlay_display_window_title);
mTitleTextView.setText(mTitle);
mWindowParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY);
mWindowParams.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
if (mSecure) {
mWindowParams.flags |= WindowManager.LayoutParams.FLAG_SECURE;
}
if (DISABLE_MOVE_AND_RESIZE) {
mWindowParams.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
}
mWindowParams.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED;
mWindowParams.alpha = WINDOW_ALPHA;
mWindowParams.gravity = Gravity.TOP | Gravity.LEFT;
mWindowParams.setTitle(mTitle);
mGestureDetector = new GestureDetector(mContext, mOnGestureListener);
mScaleGestureDetector = new ScaleGestureDetector(mContext, mOnScaleGestureListener);
// Set the initial position and scale.
// The position and scale will be clamped when the display is first shown.
mWindowX = (mGravity & Gravity.LEFT) == Gravity.LEFT ? 0 : mDefaultDisplayInfo.logicalWidth;
mWindowY = (mGravity & Gravity.TOP) == Gravity.TOP ? 0 : mDefaultDisplayInfo.logicalHeight;
mWindowScale = INITIAL_SCALE;
}
use of android.view.ScaleGestureDetector in project android_frameworks_base by AOSPA.
the class ExpandHelper method cancel.
/**
* Use this to abort any pending expansions in progress.
*/
public void cancel() {
finishExpanding(true, /* forceAbort */
0f);
clearView();
// reset the gesture detector
mSGD = new ScaleGestureDetector(mContext, mScaleGestureListener);
}
use of android.view.ScaleGestureDetector in project mobile-android by photo.
the class CropImageView method init.
/*
* (non-Javadoc)
*
* @see it.sephiroth.android.library.imagezoom.ImageViewTouch#init()
*/
@Override
protected void init() {
super.init();
mGestureDetector = null;
mScaleDetector = null;
mGestureListener = null;
mScaleListener = null;
mScaleDetector = new ScaleGestureDetector(getContext(), new CropScaleListener());
mGestureDetector = new GestureDetector(getContext(), new CropGestureListener(), null, true);
mGestureDetector.setIsLongpressEnabled(false);
// mTouchSlop = 20 * 20;
}
use of android.view.ScaleGestureDetector in project robolectric by robolectric.
the class ShadowScaleGestureDetectorTest method setUp.
@Before
public void setUp() throws Exception {
detector = new ScaleGestureDetector(RuntimeEnvironment.application, null);
motionEvent = MotionEvent.obtain(-1, -1, MotionEvent.ACTION_UP, 100, 30, -1);
}
Aggregations