Android Open Source - pixel-art Scale Listener






From Project

Back to project page pixel-art.

License

The source code is released under:

Apache License

If you think the Android project pixel-art listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.jaween.pixelart.util;
//from  w  w  w. j  a va2s.c  o  m
import android.content.Context;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;

/**
 * Created by ween on 9/30/14.
 */
public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

    private final float horizontalMin;
    private final float horizontalMax;
    private final float verticalMin;
    private final float verticalMax;

    private final float minScale;
    private final float maxScale;

    // Two finger drag
    float lastDragFocusX;
    float lastDragFocusY;

    private PointF viewportFocus = new PointF();
    private RectF viewport = new RectF();
    private Rect contentRect = new Rect();
    private float scale;

    private ScaleGestureDetector scaleGestureDetector;
    private GestureDetector gestureDetector;
    private boolean isScaling = false;

    public ScaleListener(Context context, float minScale, float maxScale, RectF viewport, Rect containerRect) {

        scale = containerRect.width() / viewport.width();

        horizontalMin = -containerRect.width() / 2;
        horizontalMax = containerRect.width() + containerRect.width() / 2;
        verticalMin = -containerRect.width() / 2;
        verticalMax = containerRect.width() + containerRect.width() / 2;

        gestureDetector = new GestureDetector(context, gestureListener);

        this.minScale = minScale;
        this.maxScale = maxScale;
        this.viewport = viewport;
        this.contentRect = containerRect;
    }

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        scaleGestureDetector = detector;

        scale *= detector.getScaleFactor();

        constrainScale();

        float newWidth = contentRect.width() / scale;
        float newHeight = contentRect.height() / scale;

        float focusX = detector.getFocusX();
        float focusY = detector.getFocusY();
        hitTest(focusX, focusY, viewportFocus);

        viewport.set(
                viewportFocus.x - newWidth * (focusX - contentRect.left) / contentRect.width(),
                viewportFocus.y - newHeight * (focusY - contentRect.top) / contentRect.height(),
                0,
                0);

        viewport.right = viewport.left + newWidth;
        viewport.bottom = viewport.top + newHeight;
        //constrainViewport();

        return true;
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        isScaling = true;

        return true;
    }

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {
        isScaling = false;
    }

    private boolean hitTest(float x, float y, PointF destination) {
        if (!contentRect.contains((int) x, (int) y)) {
            return false;
        }

        destination.set(
                viewport.left
                        + viewport.width()
                        * (x - contentRect.left) / contentRect.width(),
                viewport.top
                        + viewport.height()
                        * (y - contentRect.top) / contentRect.height());

        return true;
    }

    private void constrainViewport() {
        /*viewport.left = Math.max(horizontalMin, viewport.left);
        viewport.top = Math.max(verticalMin, viewport.top);
        viewport.bottom = Math.min(verticalMax, viewport.bottom);
        viewport.right = Math.min(horizontalMax, viewport.right);*/

        if (viewport.left / scale < horizontalMin) {
            viewport.right = horizontalMin + viewport.width();
            viewport.left = horizontalMin;
        } else if (viewport.right / scale > horizontalMax) {
            viewport.left = horizontalMax - viewport.width();
            viewport.right = horizontalMax;
        }

        if (viewport.top / scale < verticalMin) {
            viewport.bottom = verticalMin + viewport.height();
            viewport.top = verticalMin;
        } else if (viewport.bottom / scale > verticalMax) {
            viewport.top = verticalMax - viewport.height();
            viewport.bottom = verticalMax;
        }
    }

    // Keeps the scale within a minimum and maximum
    private void constrainScale() {
        if (scale < minScale) {
            scale = minScale;
        } else if (scale > maxScale) {
            scale = maxScale;
        }
    }

    private void setViewportTopLeft(float x, float y) {
        float currentWidth = viewport.width();
        float currentHeight = viewport.height();

        //x = Math.max(horizontalMin, Math.min(x, horizontalMax - currentWidth));
        //y = Math.max(verticalMin, Math.min(y, verticalMax - currentHeight));

        viewport.set(x, y, x + currentWidth, y + currentHeight);
    }

    public void dragBegin(float x1, float y1, float x2, float y2) {
        lastDragFocusX = (x1 + x2) / 2f;
        lastDragFocusY = (y1 + y2) / 2f;
    }

    public void drag(float x1, float y1, float x2, float y2) {
        float width = viewport.width();
        float height = viewport.height();

        float dragFocusX = (x1 + x2) / 2f;
        float dragFocusY = (y1 + y2) / 2f;

        viewport.left -= (dragFocusX - lastDragFocusX) / scale;
        viewport.top -= (dragFocusY - lastDragFocusY) / scale;
        viewport.right = viewport.left + width;
        viewport.bottom = viewport.top + height;

        lastDragFocusX = dragFocusX;
        lastDragFocusY = dragFocusY;
    }


    // TODO: Remove this from being inline
    private final GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onDown(MotionEvent e) {
            return super.onDown(e);
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return super.onDoubleTap(e);
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            if (isScaling) {
                float viewportOffsetX = distanceX * viewport.width() / contentRect.width();
                float viewportOffsetY = distanceY * viewport.height() / contentRect.height();


                setViewportTopLeft(viewport.left + viewportOffsetX, viewport.top + viewportOffsetY);
                return true;
            }
            return false;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    };

    public GestureDetector getGestureDetector() {
        return gestureDetector;
    }

    public float getScale() {
        return scale;
    }

    public void setScale(float scale) {
        this.scale = scale;
    }

    public RectF getViewport() {
        return viewport;
    }

    public void setViewport(RectF viewport) {
        this.viewport = viewport;
    }
}




Java Source Code List

com.jaween.pixelart.ContainerActivity.java
com.jaween.pixelart.ContainerFragment.java
com.jaween.pixelart.PanelManagerFragment.java
com.jaween.pixelart.io.AnimationFile.java
com.jaween.pixelart.io.FileAdapter.java
com.jaween.pixelart.io.ImportExport.java
com.jaween.pixelart.io.LoadFileDialog.java
com.jaween.pixelart.tools.Command.java
com.jaween.pixelart.tools.Dropper.java
com.jaween.pixelart.tools.Eraser.java
com.jaween.pixelart.tools.FloodFill.java
com.jaween.pixelart.tools.FreeSelect.java
com.jaween.pixelart.tools.MagicWand.java
com.jaween.pixelart.tools.Oval.java
com.jaween.pixelart.tools.Pen.java
com.jaween.pixelart.tools.RectSelect.java
com.jaween.pixelart.tools.Rect.java
com.jaween.pixelart.tools.Selection.java
com.jaween.pixelart.tools.ToolReport.java
com.jaween.pixelart.tools.Tool.java
com.jaween.pixelart.tools.attributes.EraserToolAttributes.java
com.jaween.pixelart.tools.attributes.MagicWandToolAttributes.java
com.jaween.pixelart.tools.attributes.OvalToolAttributes.java
com.jaween.pixelart.tools.attributes.PenToolAttributes.java
com.jaween.pixelart.tools.attributes.RectToolAttributes.java
com.jaween.pixelart.tools.attributes.ToolAttributes.java
com.jaween.pixelart.tools.options.EraserOptionsView.java
com.jaween.pixelart.tools.options.MagicWandOptionsView.java
com.jaween.pixelart.tools.options.OvalOptionsView.java
com.jaween.pixelart.tools.options.PenOptionsView.java
com.jaween.pixelart.tools.options.RectOptionsView.java
com.jaween.pixelart.tools.options.ToolOptionsView.java
com.jaween.pixelart.ui.ColourButton.java
com.jaween.pixelart.ui.ColourSelector.java
com.jaween.pixelart.ui.DrawingFragment.java
com.jaween.pixelart.ui.DrawingSurface.java
com.jaween.pixelart.ui.PaletteFragment.java
com.jaween.pixelart.ui.PanelFragment.java
com.jaween.pixelart.ui.PixelGrid.java
com.jaween.pixelart.ui.Thumbnail.java
com.jaween.pixelart.ui.ToolButton.java
com.jaween.pixelart.ui.ToolboxFragment.java
com.jaween.pixelart.ui.TransparencyCheckerboard.java
com.jaween.pixelart.ui.animation.AnimationFragment.java
com.jaween.pixelart.ui.animation.FrameAdapter.java
com.jaween.pixelart.ui.animation.Frame.java
com.jaween.pixelart.ui.colourpicker.ColourPickerDialog.java
com.jaween.pixelart.ui.colourpicker.ColourPickerFragment.java
com.jaween.pixelart.ui.colourpicker.ColourPickerView.java
com.jaween.pixelart.ui.layer.LayerAdapter.java
com.jaween.pixelart.ui.layer.LayerFragment.java
com.jaween.pixelart.ui.layer.Layer.java
com.jaween.pixelart.ui.undo.DrawOpManager.java
com.jaween.pixelart.ui.undo.DrawOpUndoData.java
com.jaween.pixelart.ui.undo.FrameUndoData.java
com.jaween.pixelart.ui.undo.LayerUndoData.java
com.jaween.pixelart.ui.undo.UndoItem.java
com.jaween.pixelart.ui.undo.UndoManager.java
com.jaween.pixelart.util.AbsVerticalSeekBar.java
com.jaween.pixelart.util.AnimatedGifEncoder.java
com.jaween.pixelart.util.AutoSaver.java
com.jaween.pixelart.util.BitmapEncoder.java
com.jaween.pixelart.util.Color.java
com.jaween.pixelart.util.ConfigChangeFragment.java
com.jaween.pixelart.util.Debug.java
com.jaween.pixelart.util.MarchingAnts.java
com.jaween.pixelart.util.PreferenceManager.java
com.jaween.pixelart.util.ScaleListener.java
com.jaween.pixelart.util.SlideAnimator.java
com.jaween.pixelart.util.SlidingLinearLayout.java
com.jaween.pixelart.util.VerticalProgressBar.java
com.tokaracamara.android.verticalslidevar.VerticalSeekBar.java