diff options
author | Mario Bertschler <bmario@google.com> | 2017-01-30 17:05:24 -0800 |
---|---|---|
committer | Mario Bertschler <bmario@google.com> | 2017-05-03 10:32:57 -0700 |
commit | 48198d004af64d0d7c8b86bc243087f68dc374c9 (patch) | |
tree | 503173ab33803b465990dff9ed62a8731d5f7e80 /src/com/android/launcher3/graphics | |
parent | 2526ba8215976432806c69c468f7b556e7877513 (diff) | |
download | android_packages_apps_Trebuchet-48198d004af64d0d7c8b86bc243087f68dc374c9.tar.gz android_packages_apps_Trebuchet-48198d004af64d0d7c8b86bc243087f68dc374c9.tar.bz2 android_packages_apps_Trebuchet-48198d004af64d0d7c8b86bc243087f68dc374c9.zip |
All Apps transition with gradient and scrim.
The transition is behind a feature flag and
turned off by default.
Change-Id: I155840ba82b5a573d874376797db5f739a52d706
Diffstat (limited to 'src/com/android/launcher3/graphics')
-rw-r--r-- | src/com/android/launcher3/graphics/RadialGradientView.java | 146 | ||||
-rw-r--r-- | src/com/android/launcher3/graphics/ScrimView.java | 97 |
2 files changed, 243 insertions, 0 deletions
diff --git a/src/com/android/launcher3/graphics/RadialGradientView.java b/src/com/android/launcher3/graphics/RadialGradientView.java new file mode 100644 index 000000000..cf6851c00 --- /dev/null +++ b/src/com/android/launcher3/graphics/RadialGradientView.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.graphics; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RadialGradient; +import android.graphics.RectF; +import android.graphics.Shader; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.DecelerateInterpolator; + +import com.android.launcher3.R; +import com.android.launcher3.Utilities; + +/** + * Draws a translucent radial gradient background from an initial state with progress 0.0 to a + * final state with progress 1.0; + */ +public class RadialGradientView extends View { + + public static final int DEFAULT_COLOR_1 = Color.WHITE; + public static final int DEFAULT_COLOR_2 = Color.BLACK; + + private static Bitmap sFinalGradientMask; + private static Bitmap sAlphaGradientMask; + + // TODO needs to be cleaned up once design finalizes + static class Config { + // dimens + final float gradientCenterX = 0.5f; + final float gradientCenterY = 1.05f; + final float gradientHeadStartFactor = 0.35f; + final float gradientAlphaMaskLengthDp = 700; + // interpolation + final boolean useGradientAlphaDecel = false; + final float decelFactorForGradientAlpha = 2f; + // colors + final float finalGradientAlpha = 0.75f; + int color1 = DEFAULT_COLOR_1; + int color2 = DEFAULT_COLOR_2; + } + + private final RectF mAlphaMaskRect = new RectF(); + private final RectF mFinalMaskRect = new RectF(); + private final Paint mPaint = new Paint(); + private final Config mConfig = new Config(); + private final DecelerateInterpolator mDecelInterpolator; + private float mProgress; + private int mWidth; + private int mHeight; + private final int mMaskHeight; + private final Context mAppContext; + + public RadialGradientView(Context context, AttributeSet attrs) { + super(context, attrs); + this.mAppContext = context.getApplicationContext(); + this.mDecelInterpolator = new DecelerateInterpolator(mConfig.decelFactorForGradientAlpha); + this.mMaskHeight = Utilities.pxFromDp(mConfig.gradientAlphaMaskLengthDp, + mAppContext.getResources().getDisplayMetrics()); + + if (sFinalGradientMask == null) { + sFinalGradientMask = Utilities.convertToAlphaMask( + Utilities.createOnePixBitmap(), mConfig.finalGradientAlpha); + } + if (sAlphaGradientMask == null) { + Bitmap alphaMaskFromResource = BitmapFactory.decodeResource(context.getResources(), + R.drawable.all_apps_alpha_mask); + sAlphaGradientMask = Utilities.convertToAlphaMask( + alphaMaskFromResource, mConfig.finalGradientAlpha); + } + } + + public void onExtractedColorsChanged(int color1, int color2) { + mConfig.color1 = color1; + mConfig.color2 = color2; + if (mWidth + mHeight > 0) { + createRadialShader(); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + this.mWidth = getMeasuredWidth(); + this.mHeight = getMeasuredHeight(); + if (mWidth + mHeight > 0) { + createRadialShader(); + } + } + + // only being called when colors change + private void createRadialShader() { + float radius = Math.max(mHeight, mWidth) * mConfig.gradientCenterY; + + float posScreenBottom = (radius - mHeight) / radius; // center lives below screen + RadialGradient shader = new RadialGradient( + mWidth * mConfig.gradientCenterX, + mHeight * mConfig.gradientCenterY, + radius, + new int[] {mConfig.color1, mConfig.color1, mConfig.color2}, + new float[] {0f, posScreenBottom, 1f}, + Shader.TileMode.CLAMP); + mPaint.setShader(shader); + } + + public void setProgress(float progress) { + this.mProgress = progress; + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + float head = mConfig.gradientHeadStartFactor; + float linearProgress = head + (mProgress * (1f - head)); + float adjustProgress = mConfig.useGradientAlphaDecel + ? mDecelInterpolator.getInterpolation(linearProgress) + : linearProgress; + float startMaskY = (1f - adjustProgress) * mHeight - mMaskHeight * adjustProgress; + + mAlphaMaskRect.set(0, startMaskY, mWidth, startMaskY + mMaskHeight); + mFinalMaskRect.set(0, startMaskY + mMaskHeight, mWidth, mHeight); + canvas.drawBitmap(sAlphaGradientMask, null, mAlphaMaskRect, mPaint); + canvas.drawBitmap(sFinalGradientMask, null, mFinalMaskRect, mPaint); + } + +}
\ No newline at end of file diff --git a/src/com/android/launcher3/graphics/ScrimView.java b/src/com/android/launcher3/graphics/ScrimView.java new file mode 100644 index 000000000..521fbedd6 --- /dev/null +++ b/src/com/android/launcher3/graphics/ScrimView.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.launcher3.graphics; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.RectF; +import android.support.v4.graphics.ColorUtils; +import android.util.AttributeSet; +import android.view.View; + +import com.android.launcher3.R; +import com.android.launcher3.Utilities; + +public class ScrimView extends View { + + // Config + private static final int MASK_HEIGHT_DP = 600; + private static final float MASK_START_LENGTH_FACTOR = 0.4f; + private static final float FINAL_ALPHA = 0.87f; + private static final int SCRIM_COLOR = ColorUtils.setAlphaComponent( + Color.WHITE, (int) (FINAL_ALPHA * 255)); + + private static Bitmap sFinalScrimMask; + private static Bitmap sAlphaScrimMask; + + private final int mMaskHeight; + private int mVisibleHeight; + private final int mHeadStart; + + private final RectF mAlphaMaskRect = new RectF(); + private final RectF mFinalMaskRect = new RectF(); + private final Paint mPaint = new Paint(); + private float mProgress; + + public ScrimView(Context context, AttributeSet attrs) { + super(context, attrs); + mMaskHeight = Utilities.pxFromDp(MASK_HEIGHT_DP, getResources().getDisplayMetrics()); + mHeadStart = (int) (mMaskHeight * MASK_START_LENGTH_FACTOR); + mPaint.setColor(SCRIM_COLOR); + + if (sFinalScrimMask == null) { + sFinalScrimMask = Utilities.convertToAlphaMask( + Utilities.createOnePixBitmap(), FINAL_ALPHA); + } + if (sAlphaScrimMask == null) { + Bitmap alphaMaskFromResource = BitmapFactory.decodeResource(getResources(), + R.drawable.all_apps_alpha_mask); + sAlphaScrimMask = Utilities.convertToAlphaMask(alphaMaskFromResource, FINAL_ALPHA); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + mVisibleHeight = MeasureSpec.getSize(heightMeasureSpec); + int fullHeight = mVisibleHeight * 2 + mMaskHeight; + setMeasuredDimension(width, fullHeight); + setProgress(mProgress); + } + + public void setProgress(float progress) { + mProgress = progress; + float initialY = mVisibleHeight - mHeadStart; + float fullTranslationY = mMaskHeight + initialY + mVisibleHeight; + float translationY = initialY - progress * fullTranslationY; + setTranslationY(translationY); + } + + @Override + protected void onDraw(Canvas canvas) { + mAlphaMaskRect.set(0, 0, getWidth(), mMaskHeight); + mFinalMaskRect.set(0, mMaskHeight, getWidth(), getHeight()); + canvas.drawBitmap(sAlphaScrimMask, null, mAlphaMaskRect, mPaint); + canvas.drawBitmap(sFinalScrimMask, null, mFinalMaskRect, mPaint); + } + +} |