Working around overscroll issues in AllApps.

- For the time being, we are going to do custom drawing to ensure that we get the touch
  events in the right order, while still allowing the recycler view to draw the overscroll
  effect on top of the prediction bar.

Bug: 21335369
Change-Id: I6bf64e5c1e9aa634a953223a5decf74942e4fb57
This commit is contained in:
Winson Chung
2015-06-22 19:48:07 -07:00
parent 01d4ffdef4
commit 243fdd7cdf
6 changed files with 79 additions and 2 deletions
@@ -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);
}
}
}
}