SwipeToDismissActivity.java revision e8e0eae2600001c8b1e9d5a9f0331cf045193746
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.example.android.supportv7.widget.touch; 18 19import com.example.android.supportv7.R; 20import com.example.android.supportv7.widget.util.ConfigToggle; 21 22import android.annotation.TargetApi; 23import android.graphics.Canvas; 24import android.os.Build; 25import android.support.v4.content.ContextCompat; 26import android.support.v4.view.MotionEventCompat; 27import android.support.v7.widget.RecyclerView; 28import android.support.v7.widget.helper.ItemTouchHelper; 29import android.view.MotionEvent; 30import android.view.View; 31import android.view.ViewGroup; 32 33public class SwipeToDismissActivity extends ItemTouchHelperActivity { 34 boolean mSwipeStartEnabled = true; 35 boolean mSwipeEndEnabled = true; 36 boolean mPointerSwipeEnabled = true; 37 boolean mCustomSwipeEnabled = false; 38 39 @Override 40 ConfigToggle[] createConfigToggles() { 41 ConfigToggle[] configToggles = { 42 new ConfigToggle(this, R.string.swipe_start) { 43 @Override 44 public boolean isChecked() { 45 return mSwipeStartEnabled; 46 } 47 48 @Override 49 public void onChange(boolean newValue) { 50 mSwipeStartEnabled = newValue; 51 } 52 }, 53 new ConfigToggle(this, R.string.swipe_end) { 54 @Override 55 public boolean isChecked() { 56 return mSwipeEndEnabled; 57 } 58 59 @Override 60 public void onChange(boolean newValue) { 61 mSwipeEndEnabled = newValue; 62 } 63 }, 64 new ConfigToggle(this, R.string.pointer_swipe_enabled) { 65 @Override 66 public boolean isChecked() { 67 return mPointerSwipeEnabled; 68 } 69 70 @Override 71 public void onChange(boolean newValue) { 72 mPointerSwipeEnabled = newValue; 73 mAdapter.notifyDataSetChanged(); 74 } 75 } 76 }; 77 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 78 ConfigToggle[] copy = new ConfigToggle[configToggles.length + 1]; 79 System.arraycopy(configToggles, 0, copy, 0, configToggles.length); 80 copy[copy.length - 1] = new ConfigToggle(this, R.string.custom_swipe_enabled) { 81 @Override 82 public boolean isChecked() { 83 return mCustomSwipeEnabled; 84 } 85 86 @Override 87 public void onChange(boolean newValue) { 88 mCustomSwipeEnabled = newValue; 89 } 90 }; 91 return copy; 92 } else { 93 return configToggles; 94 } 95 } 96 97 @Override 98 public void onBind(ItemTouchViewHolder viewHolder) { 99 super.onBind(viewHolder); 100 viewHolder.actionButton.setVisibility(mPointerSwipeEnabled ? View.GONE : View.VISIBLE); 101 } 102 103 @Override 104 public void clearView(RecyclerView.ViewHolder viewHolder) { 105 super.clearView(viewHolder); 106 ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder; 107 touchVH.cardView.setCardBackgroundColor( 108 ContextCompat.getColor(this, android.R.color.white)); 109 touchVH.overlay.setVisibility(View.GONE); 110 } 111 112 @Override 113 @TargetApi(Build.VERSION_CODES.HONEYCOMB) 114 public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { 115 ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder; 116 if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { 117 touchVH.cardView.setCardBackgroundColor( 118 ContextCompat.getColor(this, R.color.card_aquatic)); 119 if (mCustomSwipeEnabled) { 120 // hide it 121 touchVH.overlay.setTranslationX(viewHolder.itemView.getWidth()); 122 touchVH.overlay.setVisibility(View.VISIBLE); 123 } 124 } 125 super.onSelectedChanged(viewHolder, actionState); 126 } 127 128 @Override 129 @TargetApi(Build.VERSION_CODES.HONEYCOMB) 130 public boolean onChildDraw(Canvas c, RecyclerView recyclerView, 131 RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, 132 boolean isCurrentlyActive) { 133 if (!mCustomSwipeEnabled) { 134 return false; 135 } 136 ItemTouchViewHolder touchVH = (ItemTouchViewHolder) viewHolder; 137 final float dir = Math.signum(dX); 138 if (dir == 0) { 139 touchVH.overlay.setTranslationX(-touchVH.overlay.getWidth()); 140 } else { 141 final float overlayOffset = dX - dir * viewHolder.itemView.getWidth(); 142 touchVH.overlay.setTranslationX(overlayOffset); 143 } 144 float alpha = (float) (.2 + .8 * Math.abs(dX) / viewHolder.itemView.getWidth()); 145 touchVH.overlay.setAlpha(alpha); 146 return true; 147 } 148 149 @Override 150 public ItemTouchViewHolder onCreateViewHolder(ViewGroup parent) { 151 final ItemTouchViewHolder vh = super.onCreateViewHolder(parent); 152 vh.actionButton.setText(R.string.swipe); 153 vh.actionButton.setOnTouchListener(new View.OnTouchListener() { 154 @Override 155 public boolean onTouch(View v, MotionEvent event) { 156 if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { 157 mItemTouchHelper.startSwipe(vh); 158 } 159 return false; 160 } 161 }); 162 return vh; 163 } 164 165 @Override 166 public boolean isPointerSwipeEnabled() { 167 return mPointerSwipeEnabled; 168 } 169 170 @Override 171 public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 172 return mCallback.makeMovementFlags(0, 173 (mSwipeStartEnabled ? ItemTouchHelper.START : 0) | 174 (mSwipeEndEnabled ? ItemTouchHelper.END : 0)); 175 } 176} 177