Inflate dismissal background instead of drawing while swiping
- Only swipe the foreground out to have the background revealed. - Inflate dismissal_swipe_background.xml while swiping. - Fix the fly-in transition. - Fix the overlapping problem. Bug: 129742618 Test: robotests Change-Id: I5311e50332d0ea0437d1693d075d5c3a2176a443
This commit is contained in:
@@ -18,6 +18,7 @@ package com.android.settings.homepage.contextualcards.slices;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import androidx.slice.Slice;
|
||||
@@ -70,10 +71,12 @@ class SliceFullCardRendererHelper {
|
||||
|
||||
static class SliceViewHolder extends RecyclerView.ViewHolder {
|
||||
public final SliceView sliceView;
|
||||
public final LinearLayout sliceViewWrapper;
|
||||
|
||||
public SliceViewHolder(View view) {
|
||||
super(view);
|
||||
sliceView = view.findViewById(R.id.slice_view);
|
||||
sliceViewWrapper = view.findViewById(R.id.slice_view_wrapper);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -18,9 +18,6 @@ package com.android.settings.homepage.contextualcards.slices;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.view.View;
|
||||
import android.widget.ViewFlipper;
|
||||
|
||||
@@ -41,18 +38,10 @@ public class SwipeDismissalDelegate extends ItemTouchHelper.Callback {
|
||||
|
||||
private final Context mContext;
|
||||
private final SwipeDismissalDelegate.Listener mListener;
|
||||
private final Drawable mIconDelete;
|
||||
private final Paint mBgPaint;
|
||||
private final int mBgCornerRadius;
|
||||
|
||||
public SwipeDismissalDelegate(Context context, SwipeDismissalDelegate.Listener listener) {
|
||||
mContext = context;
|
||||
mListener = listener;
|
||||
mIconDelete = mContext.getDrawable(R.drawable.ic_delete);
|
||||
mBgPaint = new Paint();
|
||||
mBgPaint.setColor(mContext.getColor(R.color.homepage_card_dismissal_background));
|
||||
mBgCornerRadius = mContext.getResources()
|
||||
.getDimensionPixelSize(R.dimen.homepage_card_corner_radius);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -100,41 +89,49 @@ public class SwipeDismissalDelegate extends ItemTouchHelper.Callback {
|
||||
mListener.onSwiped(viewHolder.getAdapterPosition());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearView(@NonNull RecyclerView recyclerView,
|
||||
@NonNull RecyclerView.ViewHolder viewHolder) {
|
||||
final View view = getSwipeableView(viewHolder);
|
||||
getDefaultUIUtil().clearView(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
|
||||
@NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
|
||||
boolean isCurrentlyActive) {
|
||||
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
|
||||
final View view = getSwipeableView(viewHolder);
|
||||
final View iconStart = viewHolder.itemView.findViewById(R.id.dismissal_icon_start);
|
||||
final View iconEnd = viewHolder.itemView.findViewById(R.id.dismissal_icon_end);
|
||||
|
||||
final View itemView = viewHolder.itemView;
|
||||
final int iconMargin = mContext.getResources()
|
||||
.getDimensionPixelSize(R.dimen.homepage_card_dismissal_side_margin);
|
||||
final int iconTop =
|
||||
itemView.getTop() + (itemView.getHeight() - mIconDelete.getIntrinsicHeight()) / 2;
|
||||
final int iconBottom = iconTop + mIconDelete.getIntrinsicHeight();
|
||||
|
||||
if (dX > 0) { //swipe to the right
|
||||
final int iconLeft = itemView.getLeft() + iconMargin;
|
||||
final int iconRight = iconLeft + mIconDelete.getIntrinsicWidth();
|
||||
final RectF rect = new RectF(itemView.getLeft(), itemView.getTop(),
|
||||
itemView.getLeft() + ((int) dX) + mBgCornerRadius, itemView.getBottom());
|
||||
mIconDelete.setBounds(iconLeft, iconTop, iconRight, iconBottom);
|
||||
c.drawRoundRect(rect, mBgCornerRadius, mBgCornerRadius, mBgPaint);
|
||||
if (dX > 0) {
|
||||
iconStart.setVisibility(View.VISIBLE);
|
||||
iconEnd.setVisibility(View.GONE);
|
||||
} else if (dX < 0) {
|
||||
final int iconRight = itemView.getRight() - iconMargin;
|
||||
final int iconLeft = iconRight - mIconDelete.getIntrinsicWidth();
|
||||
final RectF rect = new RectF(itemView.getRight() + ((int) dX), itemView.getTop(),
|
||||
itemView.getRight(), itemView.getBottom());
|
||||
mIconDelete.setBounds(iconLeft, iconTop, iconRight, iconBottom);
|
||||
c.drawRoundRect(rect, mBgCornerRadius, mBgCornerRadius, mBgPaint);
|
||||
iconStart.setVisibility(View.GONE);
|
||||
iconEnd.setVisibility(View.VISIBLE);
|
||||
}
|
||||
mIconDelete.draw(c);
|
||||
getDefaultUIUtil().onDraw(c, recyclerView, view, dX, dY, actionState, isCurrentlyActive);
|
||||
}
|
||||
|
||||
private int getInitialViewId(RecyclerView.ViewHolder viewHolder) {
|
||||
if (viewHolder.getItemViewType() == SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH) {
|
||||
return R.id.content;
|
||||
}
|
||||
return R.id.slice_view;
|
||||
return R.id.slice_view_wrapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the foreground view from the {@link android.widget.FrameLayout} as we only swipe
|
||||
* the foreground out in {@link SwipeDismissalDelegate#onChildDraw} and gets the view
|
||||
* beneath revealed.
|
||||
*
|
||||
* @return The foreground view.
|
||||
*/
|
||||
private View getSwipeableView(RecyclerView.ViewHolder viewHolder) {
|
||||
if (viewHolder.getItemViewType() == SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH) {
|
||||
return ((SliceHalfCardRendererHelper.HalfCardViewHolder) viewHolder).content;
|
||||
}
|
||||
return ((SliceFullCardRendererHelper.SliceViewHolder) viewHolder).sliceViewWrapper;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user