Fancy drag/swipe effect

This commit is contained in:
Martin Fietz 2015-11-07 01:25:15 +01:00
parent 47886205f6
commit 8286a76cdf
4 changed files with 128 additions and 2 deletions

View File

@ -5,6 +5,7 @@ import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.support.v7.widget.PopupMenu; import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.util.Log; import android.util.Log;
import android.view.ContextMenu; import android.view.ContextMenu;
@ -24,6 +25,7 @@ import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget; import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.joanzapata.iconify.Iconify; import com.joanzapata.iconify.Iconify;
import com.nineoldandroids.view.ViewHelper;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@ -250,7 +252,9 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
}; };
public class Holder extends RecyclerView.ViewHolder public class Holder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnCreateContextMenuListener { implements View.OnClickListener,
View.OnCreateContextMenuListener,
ItemTouchHelperViewHolder {
TextView placeholder; TextView placeholder;
TextView title; TextView title;
TextView pubDate; TextView pubDate;
@ -278,6 +282,16 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
} }
} }
@Override
public void onItemSelected() {
ViewHelper.setAlpha(itemView, 0.5f);
}
@Override
public void onItemClear() {
ViewHelper.setAlpha(itemView, 1.0f);
}
public FeedItem getFeedItem() { return item; } public FeedItem getFeedItem() { return item; }
@Override @Override
@ -317,4 +331,26 @@ public class AllEpisodesRecycleAdapter extends RecyclerView.Adapter<AllEpisodesR
boolean isInQueue(FeedItem item); boolean isInQueue(FeedItem item);
} }
/**
* Notifies a View Holder of relevant callbacks from
* {@link ItemTouchHelper.Callback}.
*/
public interface ItemTouchHelperViewHolder {
/**
* Called when the {@link ItemTouchHelper} first registers an
* item as being moved or swiped.
* Implementations should update the item view to indicate
* it's active state.
*/
void onItemSelected();
/**
* Called when the {@link ItemTouchHelper} has completed the
* move or swipe, and the active item state should be cleared.
*/
void onItemClear();
}
} }

View File

@ -26,6 +26,7 @@ import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.GlideDrawableImageViewTarget; import com.bumptech.glide.request.target.GlideDrawableImageViewTarget;
import com.joanzapata.iconify.Iconify; import com.joanzapata.iconify.Iconify;
import com.nineoldandroids.view.ViewHelper;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@ -101,7 +102,9 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
} }
public class ViewHolder extends RecyclerView.ViewHolder public class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnCreateContextMenuListener { implements View.OnClickListener,
View.OnCreateContextMenuListener,
ItemTouchHelperViewHolder {
private final ImageView dragHandle; private final ImageView dragHandle;
private final TextView placeholder; private final TextView placeholder;
@ -170,6 +173,16 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
itemAccess.getQueueIds()); itemAccess.getQueueIds());
} }
@Override
public void onItemSelected() {
ViewHelper.setAlpha(itemView, 0.5f);
}
@Override
public void onItemClear() {
ViewHelper.setAlpha(itemView, 1.0f);
}
public void bind(FeedItem item) { public void bind(FeedItem item) {
this.item = item; this.item = item;
if(locked) { if(locked) {
@ -248,6 +261,8 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
.dontAnimate() .dontAnimate()
.into(new CoverTarget(item.getFeed().getImageUri(), placeholder, cover)); .into(new CoverTarget(item.getFeed().getImageUri(), placeholder, cover));
} }
} }
@ -306,4 +321,26 @@ public class QueueRecyclerAdapter extends RecyclerView.Adapter<QueueRecyclerAdap
int getItemDownloadProgressPercent(FeedItem item); int getItemDownloadProgressPercent(FeedItem item);
LongList getQueueIds(); LongList getQueueIds();
} }
/**
* Notifies a View Holder of relevant callbacks from
* {@link ItemTouchHelper.Callback}.
*/
public interface ItemTouchHelperViewHolder {
/**
* Called when the {@link ItemTouchHelper} first registers an
* item as being moved or swiped.
* Implementations should update the item view to indicate
* it's active state.
*/
void onItemSelected();
/**
* Called when the {@link ItemTouchHelper} has completed the
* move or swipe, and the active item state should be cleared.
*/
void onItemClear();
}
} }

View File

@ -14,6 +14,7 @@ import java.util.List;
import de.danoeh.antennapod.R; import de.danoeh.antennapod.R;
import de.danoeh.antennapod.adapter.AllEpisodesRecycleAdapter; import de.danoeh.antennapod.adapter.AllEpisodesRecycleAdapter;
import de.danoeh.antennapod.adapter.QueueRecyclerAdapter;
import de.danoeh.antennapod.core.event.QueueEvent; import de.danoeh.antennapod.core.event.QueueEvent;
import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.FeedMedia;
@ -104,6 +105,32 @@ public class NewEpisodesFragment extends AllEpisodesFragment {
snackbar.show(); snackbar.show();
h.postDelayed(r, (int)Math.ceil(snackbar.getDuration() * 1.05f)); h.postDelayed(r, (int)Math.ceil(snackbar.getDuration() * 1.05f));
} }
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,
int actionState) {
// We only want the active item
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) {
AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder itemViewHolder =
(AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
if (viewHolder instanceof AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) {
AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder itemViewHolder =
(AllEpisodesRecycleAdapter.ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemClear();
}
}
}; };
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);

View File

@ -402,6 +402,32 @@ public class QueueFragment extends Fragment {
public boolean isItemViewSwipeEnabled() { public boolean isItemViewSwipeEnabled() {
return false == UserPreferences.isQueueLocked(); return false == UserPreferences.isQueueLocked();
} }
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder,
int actionState) {
// We only want the active item
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof QueueRecyclerAdapter.ItemTouchHelperViewHolder) {
QueueRecyclerAdapter.ItemTouchHelperViewHolder itemViewHolder =
(QueueRecyclerAdapter.ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
if (viewHolder instanceof QueueRecyclerAdapter.ItemTouchHelperViewHolder) {
QueueRecyclerAdapter.ItemTouchHelperViewHolder itemViewHolder =
(QueueRecyclerAdapter.ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemClear();
}
}
} }
); );
itemTouchHelper.attachToRecyclerView(recyclerView); itemTouchHelper.attachToRecyclerView(recyclerView);