am 243fdd7c: Working around overscroll issues in AllApps.

* commit '243fdd7cdf262b341b4f66177af27eec4f5cde45':
  Working around overscroll issues in AllApps.
This commit is contained in:
Winson Chung
2015-06-23 22:01:19 +00:00
committed by Android Git Automerger
6 changed files with 79 additions and 2 deletions
+1
View File
@@ -27,6 +27,7 @@
<!-- DO NOT CHANGE THE ID -->
<com.android.launcher3.allapps.AllAppsRecyclerView
android:id="@+id/apps_list_view"
android:theme="@style/Theme.Light.CustomOverscroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal|top"
+1
View File
@@ -40,6 +40,7 @@
<!-- DO NOT CHANGE THE ID -->
<com.android.launcher3.widget.WidgetsRecyclerView
android:id="@+id/widgets_list_view"
android:theme="@style/Theme.Dark.CustomOverscroll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
+7
View File
@@ -18,6 +18,13 @@
-->
<resources>
<style name="Theme.Light.CustomOverscroll" parent="@android:style/Theme.DeviceDefault">
<item name="android:colorEdgeEffect">@color/folder_edge_effect_color</item>
</style>
<style name="Theme.Dark.CustomOverscroll" parent="@android:style/Theme.DeviceDefault">
<item name="android:colorEdgeEffect">@color/workspace_edge_effect_color</item>
</style>
<style name="Icon">
<item name="android:layout_width">match_parent</item>
@@ -16,10 +16,12 @@
package com.android.launcher3.allapps;
import android.content.Context;
import android.graphics.Canvas;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import android.view.View;
import com.android.launcher3.BaseRecyclerView;
import com.android.launcher3.BaseRecyclerViewFastScrollBar;
@@ -70,8 +72,9 @@ public class AllAppsRecyclerView extends BaseRecyclerView
public AllAppsRecyclerView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr);
mLauncher = (Launcher) context;
setOverScrollMode(View.OVER_SCROLL_NEVER);
// We have a theme on this view, so we need to coerce the base activity context from that
ContextThemeWrapper ctx = (ContextThemeWrapper) context;
mLauncher = (Launcher) ctx.getBaseContext();
}
/**
@@ -125,6 +128,18 @@ public class AllAppsRecyclerView extends BaseRecyclerView
return 0;
}
/**
* We need to override the draw to ensure that we don't draw the overscroll effect beyond the
* background bounds.
*/
@Override
protected void dispatchDraw(Canvas canvas) {
canvas.clipRect(mBackgroundPadding.left, mBackgroundPadding.top,
getWidth() - mBackgroundPadding.right,
getHeight() - mBackgroundPadding.bottom);
super.dispatchDraw(canvas);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
@@ -17,7 +17,9 @@ package com.android.launcher3.allapps;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.android.launcher3.BubbleTextView;
@@ -25,6 +27,7 @@ import com.android.launcher3.BubbleTextView.BubbleTextShadowHandler;
import com.android.launcher3.ClickShadowView;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
/**
* A container for RecyclerView to allow for the click shadow view to be shown behind an icon that
@@ -34,6 +37,7 @@ public class AllAppsRecyclerViewContainerView extends FrameLayout
implements BubbleTextShadowHandler {
private final ClickShadowView mTouchFeedbackView;
private View mPredictionBarView;
public AllAppsRecyclerViewContainerView(Context context) {
this(context, null);
@@ -56,6 +60,13 @@ public class AllAppsRecyclerViewContainerView extends FrameLayout
addView(mTouchFeedbackView, size, size);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mPredictionBarView = findViewById(R.id.prediction_bar);
}
@Override
public void setPressedIcon(BubbleTextView icon, Bitmap background) {
if (icon == null || background == null) {
@@ -66,4 +77,33 @@ public class AllAppsRecyclerViewContainerView extends FrameLayout
mTouchFeedbackView.animateShadow();
}
}
/**
* This allows us to have custom drawing order, while keeping touch handling in correct z-order.
*/
@Override
protected void dispatchDraw(Canvas canvas) {
final long drawingTime = getDrawingTime();
// Draw the click feedback first (since it is always on the bottom)
if (mTouchFeedbackView != null && mTouchFeedbackView.getVisibility() == View.VISIBLE) {
drawChild(canvas, mTouchFeedbackView, drawingTime);
}
// Then draw the prediction bar, since it needs to be "under" the recycler view to get the
// right edge effect to be drawn over it
if (mPredictionBarView != null && mPredictionBarView.getVisibility() == View.VISIBLE) {
drawChild(canvas, mPredictionBarView, drawingTime);
}
// Draw the remaining views
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
View v = getChildAt(i);
if (v != mTouchFeedbackView && v != mPredictionBarView &&
v.getVisibility() == View.VISIBLE) {
drawChild(canvas, v, drawingTime);
}
}
}
}
@@ -17,6 +17,7 @@
package com.android.launcher3.widget;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.support.v7.widget.LinearLayoutManager;
import android.util.AttributeSet;
@@ -73,6 +74,18 @@ public class WidgetsRecyclerView extends BaseRecyclerView {
public void setWidgets(WidgetsModel widgets) {
mWidgets = widgets;
}
/**
* We need to override the draw to ensure that we don't draw the overscroll effect beyond the
* background bounds.
*/
@Override
protected void dispatchDraw(Canvas canvas) {
canvas.clipRect(mBackgroundPadding.left, mBackgroundPadding.top,
getWidth() - mBackgroundPadding.right,
getHeight() - mBackgroundPadding.bottom);
super.dispatchDraw(canvas);
}
/**
* Maps the touch (from 0..1) to the adapter position that should be visible.