am 5dc58e27: am 4615fa60: Merge "Add option for recents to use fake shadows" into lmp-dev
* commit '5dc58e27194210c4af26436e755bd5ad3dc734d5': Add option for recents to use fake shadows
This commit is contained in:
@@ -117,4 +117,10 @@
|
||||
|
||||
<!-- The color of the navigation bar icons. Need to be in sync with ic_sysbar_* -->
|
||||
<color name="navigation_bar_icon_color">#E5FFFFFF</color>
|
||||
|
||||
<!-- Shadow color for the first pixels around the fake shadow for recents. -->
|
||||
<color name="fake_shadow_start_color">#44000000</color>
|
||||
|
||||
<!-- Shadow color for the furthest pixels around the fake shadow for recents. -->
|
||||
<color name="fake_shadow_end_color">#03000000</color>
|
||||
</resources>
|
||||
|
||||
@@ -39,6 +39,8 @@
|
||||
<!-- The number of app icons we keep in memory -->
|
||||
<integer name="config_recents_max_icon_count">20</integer>
|
||||
|
||||
<!-- Whether to use cheap, less good looking shadows for recents -->
|
||||
<bool name="config_recents_fake_shadows">false</bool>
|
||||
|
||||
<!-- The theme to use for RecentsActivity. -->
|
||||
<item type="style" name="config_recents_activity_theme">@style/RecentsTheme.Wallpaper</item>
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
<dimen name="unlock_falsing_threshold">80dp</dimen>
|
||||
|
||||
<!-- Lockscreen falsing threshold for quick settings. -->
|
||||
<dimen name="qs_falsing_threshold">80dp</dimen>
|
||||
<dimen name="qs_falsing_threshold">40dp</dimen>
|
||||
|
||||
<!-- Falsing threshold used when dismissing notifications from the lockscreen. -->
|
||||
<dimen name="swipe_helper_falsing_threshold">70dp</dimen>
|
||||
@@ -496,4 +496,10 @@
|
||||
|
||||
<!-- The maximum width of the navigation bar ripples. -->
|
||||
<dimen name="key_button_ripple_max_width">95dp</dimen>
|
||||
|
||||
<!-- Inset shadow for FakeShadowDrawable. It is used to avoid gaps between the card
|
||||
and the shadow. -->
|
||||
<dimen name="fake_shadow_inset">1dp</dimen>
|
||||
|
||||
<dimen name="fake_shadow_size">8dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -39,8 +39,6 @@ public class Constants {
|
||||
public static final boolean EnableDevAppInfoOnLongPress = true;
|
||||
// Enables the search bar layout
|
||||
public static final boolean EnableSearchLayout = true;
|
||||
// Enables the dynamic shadows behind each task
|
||||
public static final boolean EnableShadows = true;
|
||||
// Enables the thumbnail alpha on the front-most task
|
||||
public static final boolean EnableThumbnailAlphaOnFrontmost = false;
|
||||
// This disables the bitmap and icon caches
|
||||
|
||||
@@ -121,6 +121,7 @@ public class RecentsConfiguration {
|
||||
/** Misc **/
|
||||
public boolean useHardwareLayers;
|
||||
public int altTabKeyDelay;
|
||||
public boolean fakeShadows;
|
||||
|
||||
/** Dev options and global settings */
|
||||
public boolean lockToAppEnabled;
|
||||
@@ -274,6 +275,7 @@ public class RecentsConfiguration {
|
||||
// Misc
|
||||
useHardwareLayers = res.getBoolean(R.bool.config_recents_use_hardware_layers);
|
||||
altTabKeyDelay = res.getInteger(R.integer.recents_alt_tab_key_delay);
|
||||
fakeShadows = res.getBoolean(R.bool.config_recents_fake_shadows);
|
||||
}
|
||||
|
||||
/** Updates the system insets */
|
||||
|
||||
@@ -53,10 +53,12 @@ public class AnimateableViewBounds extends ViewOutlineProvider {
|
||||
@Override
|
||||
public void getOutline(View view, Outline outline) {
|
||||
outline.setAlpha(mMinAlpha + mAlpha / (1f - mMinAlpha));
|
||||
|
||||
// TODO: This doesn't work with fake shadows.
|
||||
outline.setRoundRect(Math.max(mClipRect.left, mOutlineClipRect.left),
|
||||
Math.max(mClipRect.top, mOutlineClipRect.top),
|
||||
mSourceView.getMeasuredWidth() - Math.max(mClipRect.right, mOutlineClipRect.right),
|
||||
mSourceView.getMeasuredHeight() - Math.max(mClipRect.bottom, mOutlineClipRect.bottom),
|
||||
mSourceView.getWidth() - Math.max(mClipRect.right, mOutlineClipRect.right),
|
||||
mSourceView.getHeight() - Math.max(mClipRect.bottom, mOutlineClipRect.bottom),
|
||||
mCornerRadius);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,286 @@
|
||||
/*
|
||||
* Copyright (C) 2014 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.systemui.recents.views;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.LinearGradient;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.RadialGradient;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.Shader;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.recents.RecentsConfiguration;
|
||||
|
||||
/**
|
||||
* A rounded rectangle drawable which also includes a shadow around. This is mostly copied from
|
||||
* frameworks/support/v7/cardview/eclair-mr1/android/support/v7/widget/
|
||||
* RoundRectDrawableWithShadow.java revision c42ba8c000d1e6ce85e152dfc17089a0a69e739f with a few
|
||||
* modifications to suit our needs in SystemUI.
|
||||
*/
|
||||
class FakeShadowDrawable extends Drawable {
|
||||
// used to calculate content padding
|
||||
final static double COS_45 = Math.cos(Math.toRadians(45));
|
||||
|
||||
final static float SHADOW_MULTIPLIER = 1.5f;
|
||||
|
||||
final float mInsetShadow; // extra shadow to avoid gaps between card and shadow
|
||||
|
||||
Paint mCornerShadowPaint;
|
||||
|
||||
Paint mEdgeShadowPaint;
|
||||
|
||||
final RectF mCardBounds;
|
||||
|
||||
float mCornerRadius;
|
||||
|
||||
Path mCornerShadowPath;
|
||||
|
||||
// updated value with inset
|
||||
float mMaxShadowSize;
|
||||
|
||||
// actual value set by developer
|
||||
float mRawMaxShadowSize;
|
||||
|
||||
// multiplied value to account for shadow offset
|
||||
float mShadowSize;
|
||||
|
||||
// actual value set by developer
|
||||
float mRawShadowSize;
|
||||
|
||||
private boolean mDirty = true;
|
||||
|
||||
private final int mShadowStartColor;
|
||||
|
||||
private final int mShadowEndColor;
|
||||
|
||||
private boolean mAddPaddingForCorners = true;
|
||||
|
||||
/**
|
||||
* If shadow size is set to a value above max shadow, we print a warning
|
||||
*/
|
||||
private boolean mPrintedShadowClipWarning = false;
|
||||
|
||||
public FakeShadowDrawable(Resources resources, RecentsConfiguration config) {
|
||||
mShadowStartColor = resources.getColor(R.color.fake_shadow_start_color);
|
||||
mShadowEndColor = resources.getColor(R.color.fake_shadow_end_color);
|
||||
mInsetShadow = resources.getDimension(R.dimen.fake_shadow_inset);
|
||||
setShadowSize(resources.getDimensionPixelSize(R.dimen.fake_shadow_size),
|
||||
resources.getDimensionPixelSize(R.dimen.fake_shadow_size));
|
||||
mCornerShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
|
||||
mCornerShadowPaint.setStyle(Paint.Style.FILL);
|
||||
mCornerShadowPaint.setDither(true);
|
||||
mCornerRadius = config.taskViewRoundedCornerRadiusPx;
|
||||
mCardBounds = new RectF();
|
||||
mEdgeShadowPaint = new Paint(mCornerShadowPaint);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAlpha(int alpha) {
|
||||
mCornerShadowPaint.setAlpha(alpha);
|
||||
mEdgeShadowPaint.setAlpha(alpha);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onBoundsChange(Rect bounds) {
|
||||
super.onBoundsChange(bounds);
|
||||
mDirty = true;
|
||||
}
|
||||
|
||||
void setShadowSize(float shadowSize, float maxShadowSize) {
|
||||
if (shadowSize < 0 || maxShadowSize < 0) {
|
||||
throw new IllegalArgumentException("invalid shadow size");
|
||||
}
|
||||
if (shadowSize > maxShadowSize) {
|
||||
shadowSize = maxShadowSize;
|
||||
if (!mPrintedShadowClipWarning) {
|
||||
Log.w("CardView", "Shadow size is being clipped by the max shadow size. See "
|
||||
+ "{CardView#setMaxCardElevation}.");
|
||||
mPrintedShadowClipWarning = true;
|
||||
}
|
||||
}
|
||||
if (mRawShadowSize == shadowSize && mRawMaxShadowSize == maxShadowSize) {
|
||||
return;
|
||||
}
|
||||
mRawShadowSize = shadowSize;
|
||||
mRawMaxShadowSize = maxShadowSize;
|
||||
mShadowSize = shadowSize * SHADOW_MULTIPLIER + mInsetShadow;
|
||||
mMaxShadowSize = maxShadowSize + mInsetShadow;
|
||||
mDirty = true;
|
||||
invalidateSelf();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getPadding(Rect padding) {
|
||||
int vOffset = (int) Math.ceil(calculateVerticalPadding(mRawMaxShadowSize, mCornerRadius,
|
||||
mAddPaddingForCorners));
|
||||
int hOffset = (int) Math.ceil(calculateHorizontalPadding(mRawMaxShadowSize, mCornerRadius,
|
||||
mAddPaddingForCorners));
|
||||
padding.set(hOffset, vOffset, hOffset, vOffset);
|
||||
return true;
|
||||
}
|
||||
|
||||
static float calculateVerticalPadding(float maxShadowSize, float cornerRadius,
|
||||
boolean addPaddingForCorners) {
|
||||
if (addPaddingForCorners) {
|
||||
return (float) (maxShadowSize * SHADOW_MULTIPLIER + (1 - COS_45) * cornerRadius);
|
||||
} else {
|
||||
return maxShadowSize * SHADOW_MULTIPLIER;
|
||||
}
|
||||
}
|
||||
|
||||
static float calculateHorizontalPadding(float maxShadowSize, float cornerRadius,
|
||||
boolean addPaddingForCorners) {
|
||||
if (addPaddingForCorners) {
|
||||
return (float) (maxShadowSize + (1 - COS_45) * cornerRadius);
|
||||
} else {
|
||||
return maxShadowSize;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setColorFilter(ColorFilter cf) {
|
||||
mCornerShadowPaint.setColorFilter(cf);
|
||||
mEdgeShadowPaint.setColorFilter(cf);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOpacity() {
|
||||
return PixelFormat.OPAQUE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Canvas canvas) {
|
||||
if (mDirty) {
|
||||
buildComponents(getBounds());
|
||||
mDirty = false;
|
||||
}
|
||||
canvas.translate(0, mRawShadowSize / 4);
|
||||
drawShadow(canvas);
|
||||
canvas.translate(0, -mRawShadowSize / 4);
|
||||
}
|
||||
|
||||
private void drawShadow(Canvas canvas) {
|
||||
final float edgeShadowTop = -mCornerRadius - mShadowSize;
|
||||
final float inset = mCornerRadius + mInsetShadow + mRawShadowSize / 2;
|
||||
final boolean drawHorizontalEdges = mCardBounds.width() - 2 * inset > 0;
|
||||
final boolean drawVerticalEdges = mCardBounds.height() - 2 * inset > 0;
|
||||
// LT
|
||||
int saved = canvas.save();
|
||||
canvas.translate(mCardBounds.left + inset, mCardBounds.top + inset);
|
||||
canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
|
||||
if (drawHorizontalEdges) {
|
||||
canvas.drawRect(0, edgeShadowTop,
|
||||
mCardBounds.width() - 2 * inset, -mCornerRadius,
|
||||
mEdgeShadowPaint);
|
||||
}
|
||||
canvas.restoreToCount(saved);
|
||||
// RB
|
||||
saved = canvas.save();
|
||||
canvas.translate(mCardBounds.right - inset, mCardBounds.bottom - inset);
|
||||
canvas.rotate(180f);
|
||||
canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
|
||||
if (drawHorizontalEdges) {
|
||||
canvas.drawRect(0, edgeShadowTop,
|
||||
mCardBounds.width() - 2 * inset, -mCornerRadius + mShadowSize,
|
||||
mEdgeShadowPaint);
|
||||
}
|
||||
canvas.restoreToCount(saved);
|
||||
// LB
|
||||
saved = canvas.save();
|
||||
canvas.translate(mCardBounds.left + inset, mCardBounds.bottom - inset);
|
||||
canvas.rotate(270f);
|
||||
canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
|
||||
if (drawVerticalEdges) {
|
||||
canvas.drawRect(0, edgeShadowTop,
|
||||
mCardBounds.height() - 2 * inset, -mCornerRadius, mEdgeShadowPaint);
|
||||
}
|
||||
canvas.restoreToCount(saved);
|
||||
// RT
|
||||
saved = canvas.save();
|
||||
canvas.translate(mCardBounds.right - inset, mCardBounds.top + inset);
|
||||
canvas.rotate(90f);
|
||||
canvas.drawPath(mCornerShadowPath, mCornerShadowPaint);
|
||||
if (drawVerticalEdges) {
|
||||
canvas.drawRect(0, edgeShadowTop,
|
||||
mCardBounds.height() - 2 * inset, -mCornerRadius, mEdgeShadowPaint);
|
||||
}
|
||||
canvas.restoreToCount(saved);
|
||||
}
|
||||
|
||||
private void buildShadowCorners() {
|
||||
RectF innerBounds = new RectF(-mCornerRadius, -mCornerRadius, mCornerRadius, mCornerRadius);
|
||||
RectF outerBounds = new RectF(innerBounds);
|
||||
outerBounds.inset(-mShadowSize, -mShadowSize);
|
||||
|
||||
if (mCornerShadowPath == null) {
|
||||
mCornerShadowPath = new Path();
|
||||
} else {
|
||||
mCornerShadowPath.reset();
|
||||
}
|
||||
mCornerShadowPath.setFillType(Path.FillType.EVEN_ODD);
|
||||
mCornerShadowPath.moveTo(-mCornerRadius, 0);
|
||||
mCornerShadowPath.rLineTo(-mShadowSize, 0);
|
||||
// outer arc
|
||||
mCornerShadowPath.arcTo(outerBounds, 180f, 90f, false);
|
||||
// inner arc
|
||||
mCornerShadowPath.arcTo(innerBounds, 270f, -90f, false);
|
||||
mCornerShadowPath.close();
|
||||
|
||||
float startRatio = mCornerRadius / (mCornerRadius + mShadowSize);
|
||||
mCornerShadowPaint.setShader(new RadialGradient(0, 0, mCornerRadius + mShadowSize,
|
||||
new int[]{mShadowStartColor, mShadowStartColor, mShadowEndColor},
|
||||
new float[]{0f, startRatio, 1f}
|
||||
, Shader.TileMode.CLAMP));
|
||||
|
||||
// we offset the content shadowSize/2 pixels up to make it more realistic.
|
||||
// this is why edge shadow shader has some extra space
|
||||
// When drawing bottom edge shadow, we use that extra space.
|
||||
mEdgeShadowPaint.setShader(new LinearGradient(0, -mCornerRadius + mShadowSize, 0,
|
||||
-mCornerRadius - mShadowSize,
|
||||
new int[]{mShadowStartColor, mShadowStartColor, mShadowEndColor},
|
||||
new float[]{0f, .5f, 1f}, Shader.TileMode.CLAMP));
|
||||
}
|
||||
|
||||
private void buildComponents(Rect bounds) {
|
||||
// Card is offset SHADOW_MULTIPLIER * maxShadowSize to account for the shadow shift.
|
||||
// We could have different top-bottom offsets to avoid extra gap above but in that case
|
||||
// center aligning Views inside the CardView would be problematic.
|
||||
final float verticalOffset = mMaxShadowSize * SHADOW_MULTIPLIER;
|
||||
mCardBounds.set(bounds.left + mMaxShadowSize, bounds.top + verticalOffset,
|
||||
bounds.right - mMaxShadowSize, bounds.bottom - verticalOffset);
|
||||
buildShadowCorners();
|
||||
}
|
||||
|
||||
float getMinWidth() {
|
||||
final float content = 2 *
|
||||
Math.max(mRawMaxShadowSize, mCornerRadius + mInsetShadow + mRawMaxShadowSize / 2);
|
||||
return content + (mRawMaxShadowSize + mInsetShadow) * 2;
|
||||
}
|
||||
|
||||
float getMinHeight() {
|
||||
final float content = 2 * Math.max(mRawMaxShadowSize, mCornerRadius + mInsetShadow
|
||||
+ mRawMaxShadowSize * SHADOW_MULTIPLIER / 2);
|
||||
return content + (mRawMaxShadowSize * SHADOW_MULTIPLIER + mInsetShadow) * 2;
|
||||
}
|
||||
}
|
||||
@@ -393,7 +393,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
|
||||
|
||||
// Upfront the processing of the thumbnail
|
||||
TaskViewTransform transform = new TaskViewTransform();
|
||||
View sourceView = tv;
|
||||
View sourceView;
|
||||
int offsetX = 0;
|
||||
int offsetY = 0;
|
||||
float stackScroll = stackView.getScroller().getStackScroll();
|
||||
@@ -406,6 +406,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV
|
||||
offsetX = transform.rect.left;
|
||||
offsetY = mConfig.displayRect.height();
|
||||
} else {
|
||||
sourceView = tv.mThumbnailView;
|
||||
transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform, null);
|
||||
}
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
|
||||
boolean mStartEnterAnimationCompleted;
|
||||
ViewAnimation.TaskViewEnterContext mStartEnterAnimationContext;
|
||||
int[] mTmpVisibleRange = new int[2];
|
||||
Rect mTmpRect = new Rect();
|
||||
TaskViewTransform mTmpTransform = new TaskViewTransform();
|
||||
HashMap<Task, TaskView> mTmpTaskViewMap = new HashMap<Task, TaskView>();
|
||||
LayoutInflater mInflater;
|
||||
@@ -537,10 +538,17 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
|
||||
if (tv.isFullScreenView()) {
|
||||
tv.measure(widthMeasureSpec, heightMeasureSpec);
|
||||
} else {
|
||||
if (tv.getBackground() != null) {
|
||||
tv.getBackground().getPadding(mTmpRect);
|
||||
} else {
|
||||
mTmpRect.setEmpty();
|
||||
}
|
||||
tv.measure(
|
||||
MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.width(),
|
||||
MeasureSpec.makeMeasureSpec(
|
||||
mLayoutAlgorithm.mTaskRect.width() + mTmpRect.left + mTmpRect.right,
|
||||
MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.height() +
|
||||
MeasureSpec.makeMeasureSpec(
|
||||
mLayoutAlgorithm.mTaskRect.height() + mTmpRect.top + mTmpRect.bottom +
|
||||
tv.getMaxFooterHeight(), MeasureSpec.EXACTLY));
|
||||
}
|
||||
}
|
||||
@@ -562,8 +570,15 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
|
||||
if (tv.isFullScreenView()) {
|
||||
tv.layout(left, top, left + tv.getMeasuredWidth(), top + tv.getMeasuredHeight());
|
||||
} else {
|
||||
tv.layout(mLayoutAlgorithm.mTaskRect.left, mLayoutAlgorithm.mTaskRect.top,
|
||||
mLayoutAlgorithm.mTaskRect.right, mLayoutAlgorithm.mTaskRect.bottom +
|
||||
if (tv.getBackground() != null) {
|
||||
tv.getBackground().getPadding(mTmpRect);
|
||||
} else {
|
||||
mTmpRect.setEmpty();
|
||||
}
|
||||
tv.layout(mLayoutAlgorithm.mTaskRect.left - mTmpRect.left,
|
||||
mLayoutAlgorithm.mTaskRect.top - mTmpRect.top,
|
||||
mLayoutAlgorithm.mTaskRect.right + mTmpRect.right,
|
||||
mLayoutAlgorithm.mTaskRect.bottom + mTmpRect.bottom +
|
||||
tv.getMaxFooterHeight());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,8 @@ import android.graphics.Paint;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.graphics.drawable.LayerDrawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewOutlineProvider;
|
||||
@@ -106,9 +108,12 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
|
||||
mMaxDimScale = mConfig.taskStackMaxDim / 255f;
|
||||
mClipViewInStack = true;
|
||||
mViewBounds = new AnimateableViewBounds(this, mConfig.taskViewRoundedCornerRadiusPx);
|
||||
setOutlineProvider(mViewBounds);
|
||||
setTaskProgress(getTaskProgress());
|
||||
setDim(getDim());
|
||||
if (mConfig.fakeShadows) {
|
||||
setBackground(new FakeShadowDrawable(context.getResources(), mConfig));
|
||||
}
|
||||
setOutlineProvider(mViewBounds);
|
||||
}
|
||||
|
||||
/** Set callback */
|
||||
@@ -150,24 +155,30 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
|
||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||
int height = MeasureSpec.getSize(heightMeasureSpec);
|
||||
|
||||
int widthWithoutPadding = width - mPaddingLeft - mPaddingRight;
|
||||
int heightWithoutPadding = height - mPaddingTop - mPaddingBottom;
|
||||
// Measure the bar view, thumbnail, and footer
|
||||
mHeaderView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
||||
mHeaderView.measure(MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(mConfig.taskBarHeight, MeasureSpec.EXACTLY));
|
||||
if (mFooterView != null) {
|
||||
mFooterView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
||||
mFooterView.measure(
|
||||
MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(mConfig.taskViewLockToAppButtonHeight,
|
||||
MeasureSpec.EXACTLY));
|
||||
}
|
||||
mActionButtonView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
|
||||
MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
|
||||
mActionButtonView.measure(
|
||||
MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.AT_MOST),
|
||||
MeasureSpec.makeMeasureSpec(heightWithoutPadding, MeasureSpec.AT_MOST));
|
||||
if (mIsFullScreenView) {
|
||||
// Measure the thumbnail height to be the full dimensions
|
||||
mThumbnailView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
|
||||
mThumbnailView.measure(
|
||||
MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(heightWithoutPadding, MeasureSpec.EXACTLY));
|
||||
} else {
|
||||
// Measure the thumbnail to be square
|
||||
mThumbnailView.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY));
|
||||
mThumbnailView.measure(
|
||||
MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
|
||||
MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY));
|
||||
}
|
||||
setMeasuredDimension(width, height);
|
||||
invalidateOutline();
|
||||
@@ -178,7 +189,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
|
||||
// If we are a full screen view, then only update the Z to keep it in order
|
||||
// XXX: Also update/animate the dim as well
|
||||
if (mIsFullScreenView) {
|
||||
if (Constants.DebugFlags.App.EnableShadows &&
|
||||
if (!mConfig.fakeShadows &&
|
||||
toTransform.hasTranslationZChangedFrom(getTranslationZ())) {
|
||||
setTranslationZ(toTransform.translationZ);
|
||||
}
|
||||
@@ -186,7 +197,8 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
|
||||
}
|
||||
|
||||
// Apply the transform
|
||||
toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false);
|
||||
toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false,
|
||||
!mConfig.fakeShadows);
|
||||
|
||||
// Update the task progress
|
||||
if (mTaskProgressAnimator != null) {
|
||||
@@ -258,9 +270,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
|
||||
} else if (mConfig.launchedFromHome) {
|
||||
// Move the task view off screen (below) so we can animate it in
|
||||
setTranslationY(offscreenY);
|
||||
if (Constants.DebugFlags.App.EnableShadows) {
|
||||
setTranslationZ(0);
|
||||
}
|
||||
setTranslationZ(0);
|
||||
setScaleX(1f);
|
||||
setScaleY(1f);
|
||||
}
|
||||
@@ -413,7 +423,7 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks,
|
||||
int frontIndex = (ctx.currentStackViewCount - ctx.currentStackViewIndex - 1);
|
||||
int delay = mConfig.taskViewEnterFromHomeDelay +
|
||||
frontIndex * mConfig.taskViewEnterFromHomeStaggerDelay;
|
||||
if (Constants.DebugFlags.App.EnableShadows) {
|
||||
if (!mConfig.fakeShadows) {
|
||||
animate().translationZ(transform.translationZ);
|
||||
}
|
||||
animate()
|
||||
|
||||
@@ -77,7 +77,8 @@ public class TaskViewTransform {
|
||||
}
|
||||
|
||||
/** Applies this transform to a view. */
|
||||
public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers) {
|
||||
public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers,
|
||||
boolean allowShadows) {
|
||||
// Check to see if any properties have changed, and update the task view
|
||||
if (duration > 0) {
|
||||
ViewPropertyAnimator anim = v.animate();
|
||||
@@ -87,8 +88,7 @@ public class TaskViewTransform {
|
||||
if (hasTranslationYChangedFrom(v.getTranslationY())) {
|
||||
anim.translationY(translationY);
|
||||
}
|
||||
if (Constants.DebugFlags.App.EnableShadows &&
|
||||
hasTranslationZChangedFrom(v.getTranslationZ())) {
|
||||
if (allowShadows && hasTranslationZChangedFrom(v.getTranslationZ())) {
|
||||
anim.translationZ(translationZ);
|
||||
}
|
||||
if (hasScaleChangedFrom(v.getScaleX())) {
|
||||
@@ -113,8 +113,7 @@ public class TaskViewTransform {
|
||||
if (hasTranslationYChangedFrom(v.getTranslationY())) {
|
||||
v.setTranslationY(translationY);
|
||||
}
|
||||
if (Constants.DebugFlags.App.EnableShadows &&
|
||||
hasTranslationZChangedFrom(v.getTranslationZ())) {
|
||||
if (allowShadows && hasTranslationZChangedFrom(v.getTranslationZ())) {
|
||||
v.setTranslationZ(translationZ);
|
||||
}
|
||||
if (hasScaleChangedFrom(v.getScaleX())) {
|
||||
@@ -131,9 +130,7 @@ public class TaskViewTransform {
|
||||
public static void reset(View v) {
|
||||
v.setTranslationX(0f);
|
||||
v.setTranslationY(0f);
|
||||
if (Constants.DebugFlags.App.EnableShadows) {
|
||||
v.setTranslationZ(0f);
|
||||
}
|
||||
v.setTranslationZ(0f);
|
||||
v.setScaleX(1f);
|
||||
v.setScaleY(1f);
|
||||
v.setAlpha(1f);
|
||||
|
||||
Reference in New Issue
Block a user