Search in sources :

Example 41 with ScaleGestureDetector

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;
        }
    });
}
Also used : TimerTask(java.util.TimerTask) Timer(java.util.Timer) PointF(android.graphics.PointF) ScaleGestureDetector(android.view.ScaleGestureDetector) ImageView(android.widget.ImageView) View(android.view.View) MotionEvent(android.view.MotionEvent)

Example 42 with ScaleGestureDetector

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;
}
Also used : LayoutInflater(android.view.LayoutInflater) GestureDetector(android.view.GestureDetector) ScaleGestureDetector(android.view.ScaleGestureDetector) ScaleGestureDetector(android.view.ScaleGestureDetector) WindowManager(android.view.WindowManager)

Example 43 with ScaleGestureDetector

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);
}
Also used : ScaleGestureDetector(android.view.ScaleGestureDetector)

Example 44 with ScaleGestureDetector

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;
}
Also used : GestureDetector(android.view.GestureDetector) ScaleGestureDetector(android.view.ScaleGestureDetector) ScaleGestureDetector(android.view.ScaleGestureDetector)

Example 45 with ScaleGestureDetector

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);
}
Also used : ScaleGestureDetector(android.view.ScaleGestureDetector) Before(org.junit.Before)

Aggregations

ScaleGestureDetector (android.view.ScaleGestureDetector)46 GestureDetector (android.view.GestureDetector)23 Paint (android.graphics.Paint)8 Matrix (android.graphics.Matrix)7 LayoutInflater (android.view.LayoutInflater)6 WindowManager (android.view.WindowManager)6 MotionEvent (android.view.MotionEvent)5 Point (android.graphics.Point)4 GestureDetectorCompat (android.support.v4.view.GestureDetectorCompat)4 ImageView (android.widget.ImageView)3 SuppressLint (android.annotation.SuppressLint)2 PackageManager (android.content.pm.PackageManager)2 PointF (android.graphics.PointF)2 Rect (android.graphics.Rect)2 View (android.view.View)2 ViewParent (android.view.ViewParent)2 Scroller (android.widget.Scroller)2 Drawable (android.graphics.drawable.Drawable)1 ScaleGestureDetectorCompat (android.support.v4.view.ScaleGestureDetectorCompat)1 FastOutLinearInInterpolator (android.support.v4.view.animation.FastOutLinearInInterpolator)1