Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3288dbaf authored by Adam Powell's avatar Adam Powell Committed by Android (Google) Code Review
Browse files

Merge "Tweak EdgeEffect"

parents d9c37653 2897a6fd
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3404,7 +3404,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
                                    mTouchMode = TOUCH_MODE_OVERSCROLL;
                                }
                                if (incrementalDeltaY > 0) {
                                    mEdgeGlowTop.onPull((float) overscroll / getHeight(),
                                    mEdgeGlowTop.onPull((float) -overscroll / getHeight(),
                                            (float) x / getWidth());
                                    if (!mEdgeGlowBottom.isFinished()) {
                                        mEdgeGlowBottom.onRelease();
+25 −42
Original line number Diff line number Diff line
@@ -22,14 +22,10 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Xfermode;
import android.util.Log;
import com.android.internal.R;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.FloatMath;
import android.view.animation.AnimationUtils;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
@@ -62,12 +58,9 @@ public class EdgeEffect {
    // Time it will take before a pulled glow begins receding in ms
    private static final int PULL_TIME = 167;

    // Time it will take in ms for a pulled glow to decay to partial strength before release
    private static final int PULL_DECAY_TIME = 1000;

    private static final float MAX_ALPHA = 1.f;

    private static final float MAX_GLOW_HEIGHT = 1.5f;
    private static final float MAX_GLOW_SCALE = 2.f;

    private static final float PULL_GLOW_BEGIN = 0.f;

@@ -78,7 +71,9 @@ public class EdgeEffect {

    private static final float EPSILON = 0.001f;

    private static final float SIN_45 = (float) Math.sin(Math.PI / 4);
    private static final double ANGLE = Math.PI / 6;
    private static final float SIN = (float) Math.sin(ANGLE);
    private static final float COS = (float) Math.cos(ANGLE);

    private float mGlowAlpha;
    private float mGlowScaleY;
@@ -114,6 +109,7 @@ public class EdgeEffect {
    private final RectF mArcRect = new RectF();
    private final Paint mPaint = new Paint();
    private float mRadius;
    private float mBaseGlowHeight;
    private float mDisplacement = 0.5f;
    private float mTargetDisplacement = 0.5f;

@@ -128,7 +124,7 @@ public class EdgeEffect {
        final int themeColor = a.getColor(
                com.android.internal.R.styleable.EdgeEffect_colorPrimaryLight, 0xff666666);
        a.recycle();
        mPaint.setColor((themeColor & 0xffffff) | 0x66000000);
        mPaint.setColor((themeColor & 0xffffff) | 0x33000000);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
        mInterpolator = new DecelerateInterpolator();
@@ -141,10 +137,11 @@ public class EdgeEffect {
     * @param height Effect height in pixels
     */
    public void setSize(int width, int height) {
        final float r = width * 0.5f / SIN_45;
        final float y = SIN_45 * r;
        final float r = width * 0.75f / SIN;
        final float y = COS * r;
        final float h = r - y;
        mRadius = r;
        mBaseGlowHeight = h;

        mBounds.set(mBounds.left, mBounds.top, width, (int) Math.min(height, h));
    }
@@ -214,21 +211,18 @@ public class EdgeEffect {

        mPullDistance += deltaDistance;

        final float absdd = Math.abs(deltaDistance);
        mGlowAlpha = mGlowAlphaStart = Math.min(MAX_ALPHA,
                mGlowAlpha +
                        (Math.abs(deltaDistance) * PULL_DISTANCE_ALPHA_GLOW_FACTOR));
                mGlowAlpha + (absdd * PULL_DISTANCE_ALPHA_GLOW_FACTOR));

        float glowChange = Math.abs(deltaDistance);
        if (deltaDistance > 0 && mPullDistance < 0) {
            glowChange = -glowChange;
        }
        if (mPullDistance == 0) {
            mGlowScaleY = 0;
        }
            mGlowScaleY = mGlowScaleYStart = 0;
        } else {
            final float scale = Math.max(0, 1 - 1 /
                    FloatMath.sqrt(Math.abs(mPullDistance) * mBounds.height()) - 0.3f) / 0.7f;

        // Do not allow glow to get larger than MAX_GLOW_HEIGHT.
        mGlowScaleY = mGlowScaleYStart = Math.min(MAX_GLOW_HEIGHT, Math.max(
                0, mGlowScaleY + glowChange * PULL_DISTANCE_GLOW_FACTOR));
            mGlowScaleY = mGlowScaleYStart = scale;
        }

        mGlowAlphaFinish = mGlowAlpha;
        mGlowScaleYFinish = mGlowScaleY;
@@ -311,19 +305,17 @@ public class EdgeEffect {
        final float y = mBounds.height();
        final float centerY = y - mRadius;
        final float centerX = mBounds.centerX();

        mArcRect.set(centerX - mRadius, centerY - mRadius, centerX + mRadius, centerY + mRadius);
        canvas.scale(1.f, Math.min(mGlowScaleY, 1.f), centerX, 0);

        final float displacement = Math.max(0, Math.min(mDisplacement, 1.f)) - 0.5f;
        float translateX = mBounds.width() * displacement;
        float translateY = 0;
        if (mGlowScaleY > 1.f) {
            translateY = (mGlowScaleY - 1.f) * mBounds.height();
        }
        float translateX = mBounds.width() * displacement / 2;

        canvas.clipRect(Float.MIN_VALUE, mBounds.top,
                Float.MAX_VALUE, Float.MAX_VALUE);
        canvas.translate(translateX, translateY);
        canvas.drawArc(mArcRect, 0, 180, true, mPaint);
        canvas.translate(translateX, 0);
        canvas.drawArc(mArcRect, 45, 90, true, mPaint);
        canvas.restoreToCount(count);

        boolean oneLastFrame = false;
@@ -341,7 +333,7 @@ public class EdgeEffect {
     * @return The maximum height of the edge effect
     */
    public int getMaxHeight() {
        return (int) (mBounds.height() * MAX_GLOW_HEIGHT + 0.5f);
        return (int) (mBounds.height() * MAX_GLOW_SCALE + 0.5f);
    }

    private void update() {
@@ -369,16 +361,7 @@ public class EdgeEffect {
                    mGlowScaleYFinish = 0.f;
                    break;
                case STATE_PULL:
                    mState = STATE_PULL_DECAY;
                    mStartTime = AnimationUtils.currentAnimationTimeMillis();
                    mDuration = PULL_DECAY_TIME;

                    mGlowAlphaStart = mGlowAlpha;
                    mGlowScaleYStart = mGlowScaleY;

                    // After pull, the glow should fade to nothing.
                    mGlowAlphaFinish = 0.f;
                    mGlowScaleYFinish = 0.f;
                    // Hold in this state until explicitly released.
                    break;
                case STATE_PULL_DECAY:
                    mState = STATE_RECEDE;