可删除超炫&多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990)。谢谢支持!

实例Demo下载地址在本文最后
简介
这个Demo主要是使用了cardsui-for-android开源项目,而且做了一些优化和改进:
1.自己定义card视图
2.加入长按事件。避免误操作
3.长按后能够删除card,并播放选中动画
4.删除后浮现一个悬浮button
5.点击悬浮button能够恢复之前删除的card视图
看内容前强烈建议先阅读下面的两篇文章,由于这个demo是在这两个文章的基础上写的:
关于cardsui-for-android这个开源项目的介绍和实现请看这篇博文酷炫开源项目cardsui-for-android-超具体源代码分析,具体解释所用特效是怎样实现的
4,5功能是參照开源项目cardslib。对这个开源项目的导入和简介请看这篇博文开源项目cardslib简介和导入eclipse并执行的方法
接下来对于以上的5个改进简介:(本文仅仅是提供一个思路,详细代码细节建议还是看提供的demo)
1.自己定义card视图
这里仅仅是简单的对于不同的card设置了不同的背景颜色:
CardStack stack = new CardStack(this);
stack.setTitle("请支持大苞米的博客"); for (int i = 0; i < 5; i++) {
MyCard card = null ;
switch (i) {
case 0:
card = new MyCard("#FFBB33");
break;
case 1:
card = new MyCard("#98CC00");
break;
case 2:
card = new MyCard("#A966CC");
break;
case 3:
card = new MyCard("#33B4E4");
break;
case 4:
card = new MyCard("#FF4343");
break;
}
stack.add(card);
}
mCardView.addStack(stack);
MyCard类就是我自己定义的一个继承自card类的一个实现类,详细实现请看demo中的代码,非常easy。能够非常轻松的改成自己想要的样子,这里只是多介绍。
2.加入长按事件,避免误操作
3.长按后能够删除card。并播放选中动画
在CardStack中getView()方法中能够设置对card的点击监听
//正常点击监听
cardView.setOnClickListener(getClickListener(this, container, i));
//长按点击监听
cardView.setOnLongClickListener(getOnLongClickListener(card));
//触摸监听
cardView.setOnTouchListener(new SwipeDismissTouchListener(
cardView, card, i, new OnDismissCallback() {
@Override
public void onDismiss(View view, Object token, int index) {
....
}
}
}
长按点击监听getOnLongClickListener()的实现:
//改监听传入被按的card作为引用
private OnLongClickListener getOnLongClickListener(final Card card) {
return new OnLongClickListener() { @Override
public boolean onLongClick(View v) {
//给card设置一个flag,标识这个card被长按过了
card.setLongClickable(true);
//播放动画
Animation shake = AnimationUtils.loadAnimation(mContext , R.anim.shake);
v.startAnimation(shake);
return false;
}
};
}
这个动画是一个左右来回摆动的动画,详细实现能够去代码里找,这里只是多介绍了。
这里注意长按监听里最后返回false。这里在之前的那篇文章详介绍了,作用就是将事件接着交给ontouch监听处理。
接下来看看给card设好标识位后来到onTouchListener中。由于正常点击和长按点击都会触发触摸事件
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
//按下
case MotionEvent.ACTION_DOWN: {
.....
return false;
}
//抬起
case MotionEvent.ACTION_UP: { if (dismiss && c.isLongClickable()) {
....
}
//将长按标示置为初始false
c.setLongClickable(false); break;
}
//滑动
case MotionEvent.ACTION_MOVE: { if (mSwiping & c.isLongClickable()) {
....
return true;
}
break;
}
}
如上面的伪代码中。在滑动和抬起操作时先推断card中的长按标示。最后在抬起的时候将长按标示为重置为false,这样就实现了长按操作
4.删除后浮现一个悬浮button
如图:
首先要实现这个功能就要先知道删除事件在哪,这样才干加入对应功能。
if (dismiss && c.isLongClickable()) {
// dismiss
animate(mView)
.translationX(dismissRight ? mViewWidth : -mViewWidth)
.alpha(0).setDuration(mAnimationTime)
.setListener(new AnimatorListener() {
@Override
public void onAnimationEnd(Animator arg0) {
//运行删除操作
performDismiss();
}
});
}
删除事件在上面介绍的触摸监听中滑动操作里面。假设能够删除,则先播放一段删除动画。在动画结束的回调方法中运行performDismiss()方法。
该方法运行删除的回调方法mCallback.onDismiss(mView, mToken, mIndex);,该回调方法的详细实如今最開始为card设置触摸监听的地方。
cardView.setOnTouchListener(new SwipeDismissTouchListener(
cardView, card, i, new OnDismissCallback() { @Override
public void onDismiss(View view, Object token, int index) {
Card c = (Card) token;
// call onCardSwiped() listener
c.OnSwipeCard();
cards.remove(c);
mAdapter.setItems(mStack, getPosition()); // refresh();
mAdapter.notifyDataSetChanged(); //Check for a undo message to confirm
if (isEnableUndo() && mUndoBarController!=null){ //Show UndoBar
UndoCard itemUndo=new UndoCard(c , index); if (mContext!=null){
Resources res = mContext.getResources();
if (res!=null){
int number = index+1;
String messageUndoBar = "确认要删除第"+number+"个card视图吗?";
mUndoBarController.showUndoBar(
false,
messageUndoBar,
itemUndo);
}
} }
}
}));
回调方法中先从cards集合中删除这个card。之后把这个删除的card和他的位置传递给UndoCard类。之后通过UndoBarController.showUndoBar方法来显示悬浮的点击button,这里传递的有显示的消息和携带了删除信息的UndoCard类。
之后来简单看下UndoBarController类:
public UndoBarController(View undoBarView, UndoListener undoListener,UndoBarUIElements undoBarUIElements) {
mBarView = undoBarView;
mBarAnimator = mBarView.animate();
mUndoListener = undoListener;
if (undoBarUIElements==null)
undoBarUIElements = new DefaultUndoBarUIElements();
mUndoBarUIElements = undoBarUIElements;
mMessageView = (TextView) mBarView.findViewById(mUndoBarUIElements.getUndoBarMessageId());
mBarView.findViewById(mUndoBarUIElements.getUndoBarButtonId())
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
hideUndoBar(false);
mUndoListener.onUndo(mUndoToken);
}
});
hideUndoBar(true);
}
@SuppressLint("NewApi")
public void showUndoBar(boolean immediate, CharSequence message, Parcelable undoToken) {
mUndoToken = undoToken;
mUndoMessage = message;
mMessageView.setText(mUndoMessage);
mHideHandler.removeCallbacks(mHideRunnable);
mHideHandler.postDelayed(mHideRunnable, 5000);
mBarView.setVisibility(View.VISIBLE);
if (immediate) {
mBarView.setAlpha(1);
} else {
mBarAnimator.cancel();
mBarAnimator
.alpha(1)
.setDuration(
mBarView.getResources()
.getInteger(android.R.integer.config_shortAnimTime))
.setListener(null);
}
}
@SuppressLint("NewApi")
public void hideUndoBar(boolean immediate) {
mHideHandler.removeCallbacks(mHideRunnable);
if (immediate) {
mBarView.setVisibility(View.GONE);
mBarView.setAlpha(0);
mUndoMessage = null;
mUndoToken = null;
} else {
mBarAnimator.cancel();
mBarAnimator
.alpha(0)
.setDuration(mBarView.getResources()
.getInteger(android.R.integer.config_shortAnimTime))
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mBarView.setVisibility(View.GONE);
mUndoMessage = null;
mUndoToken = null;
}
});
}
}
这里主要关注showUndoBar,hideUndoBar,UndoBarController这3个方法
showUndoBar和hideUndoBar主要就是控制显示这个悬浮button。这个button的布局在代码中事先已经加入好,这两个方法中设置它的Visibility属性就能够控制隐藏和显示。
5.点击悬浮button能够恢复之前删除的card视图
接上面。UndoBarController方法中有一个监听器,能够监听悬浮button的点击事件:
mBarView.findViewById(mUndoBarUIElements.getUndoBarButtonId())
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
hideUndoBar(false);
mUndoListener.onUndo(mUndoToken);
}
});
点击后隐藏这个button,之后运行onUndo方法来恢复被删除的card。
(mUndoToken中携带的就是被删除的Card还有他位置信息的UndoCard类)。
public interface UndoListener {
/*
* Called when you undo the action
*/
void onUndo(Parcelable undoToken);
}
这个监听器是一个接口。以下要做的就是找到实现mUndoListener.onUndo(mUndoToken)这个监听回调方法的地方。
public class CardStack extends AbstractCard implements UndoBarController.UndoListener
实现这个接口的就是我们的CardStack这个类了。接下来在类中找到onUndo回调方法。
@Override
public void onUndo(Parcelable undoToken) {
//Restore items in lists (use reverseSortedOrder)
if (undoToken != null) { UndoCard item = (UndoCard) undoToken;
Card card = item.card;
int position = item.position; if (card != null) {
add(card, position);
mAdapter.notifyDataSetChanged();
}
}
}
实现非常easy:取出存放在UndoCard中的card和位置。把他又一次加入到集合中,之后刷新适配器又一次显示。
大概的对于这个开源项目的改进介绍完成。本文仅仅是提供一个思路,详细代码细节建议还是看提供的demo。
删除恢复功能是仿照cardsui这个开源项目实现的。涉及的类上面已经介绍了就是UndoCard和UndoBarController这两个类。
最后我强烈建议好好的看看这两个类和相关的调用方法。代码不多并且设计的非常好,值得研究一下。。
。
Demo下载地址:
Github:https://github.com/a396901990/CardList/tree/master
csdn点击下载
可删除超炫&多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载的更多相关文章
- 优秀教程:使用 CSS3 动画实现的超炫的过渡特效
Codrops 最近分享了一些很酷的图片切换灵感.有三种不同的用例:小的图像幻灯片,大标题幻灯片以及使用透明背景的产品幻灯片.状态转换使用 CSS 动画完成,我们能够定义从任何方向进来的图片的行为. ...
- css3-rotate实现超炫环形旋转特效
css3-rotate实现超炫环形旋转特效,css3特效,环形旋转,圆形旋转,css3-rotate实现超炫环形旋转特效是一款采用css3 rotate实现的蓝色环形旋转特效代码. http://ww ...
- 3D HTML5 Logo标志 超炫酷旋转特效
今天又要为大家带来一款超酷的HTML5 Canvas 3D动画特效,是一款可以旋转的HTML5 Logo标志.画面上一共有两块可旋转的区域,第一是可旋转的背景,第二则是可旋转的Logo标志.Logo标 ...
- Android github上开源项目、酷炫的交互动画和视觉效果地址集合
Android上开源的酷炫的交互动画和视觉效果:http://blog.csdn.net/u013278099/article/details/50323689 Awesome-android-ui: ...
- 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目
看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...
- 超炫数字特效动画AE模板
下载方式: 网盘地址+迅雷地址+迅雷地址+备份地址 <ignore_js_op> 本AE模板是由Videohive机构出品的超炫数字特效动画AE模板,Videohive The Numbe ...
- Cool!15个超炫的 CSS3 文本特效【上篇】
每一个网页设计师都希望创建出让用户能够赏识的网站.当然,这是不可能满足每个人的口味的.幸运的是,我们有最强大的工具和资源.实际上,我们非常多的网站模板,框架,内容管理系统,先进的工具和其他的资源可以使 ...
- iHover – 30+ 纯 CSS 实现的超炫的图片悬停特效
iHover 是一个令人印象深刻的图片悬停效果集合,完全基于 CSS3 实现,无依赖,能够搭配 Bootstrap 3 很好地工作.基于 SCSS 技术构建,便于修改变量.有模块化的代码,无需包含整个 ...
- 一款纯css3实现的超炫动画背画特效
之前为大家介绍了很多款由纯css3实现的特效.今天要再给大家带来一款纯css3实现的超炫动画背画特效.代码非常简单,没有引用任何其它js代码.css代码也不多.效果非常炫.一起看下效果图: 在线预览 ...
随机推荐
- C#递归复制文件夹
/// <param name="sources">原路徑</param> /// <param name="dest">目 ...
- [积累]C++复习 海大2014硕士生面试题微信系统总结
好久没用C++了,正好同学有个面试题,于是就帮忙看了一下.尽管对C++的知识了解不少, 可是长期被Java浸淫, 发现这个简单的程序却也写着也不是那么顺手.好在最后还是搞定了,以下分析一下,题目例如以 ...
- 学习VC MFC开发必须了解的常用宏和指令
1.#include指令 包含指定的文件 2.#define指令 预定义,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善.背后一长串”的宏,它本身并不在编译过程中进行,而 ...
- Android 系统搜索框(有浏览记录)
实现Android 系统搜索框(有浏览记录),先看下效果: 一.配置搜索描述文件 要在res中的xml文件加创建sreachable.xml,内容如下: <?xml version=" ...
- mooon编译系统介绍(可复用Makefile)
mooon编译系统介绍(可复用Makefile).pdf(ChinaUnix下载) CSDN下载:http://download.csdn.net/detail/aquester/5626929 mo ...
- ASP.NET 常用内置对象详解-----Response
利用提供的内置对象,可以实现页面之间的数据传递及实现一些特定的功能,如:缓冲输出,页面重定向等等. Response :响应,反应 Request:请求 Server:服务器 Application: ...
- haproxy配置监控redis主备切换(转)
环境前提: redis sentinel配置,三台主机,且配置运行良好 配置文件中添加: frontend ft_redis bind 0.0.0.0:6379 name re ...
- cocos2d 游戏开发:Cocos2d v3 "hello world"+显示飞船
V3 RC4 版本号图片 显示一个飞船 将Chapter1中 SpaceCargoShip.png 文件 加入到项目里面. 代码在 init : CCSprite *spaceCargoShip = ...
- WM_CLOSE、WM_DESTROY、WM_QUIT学习总结(点击关闭按钮会触发WM_CLOSE消息,DestroyWindow API会触发WM_DESTROY和WM_NCDESTROY消息,MSDN上写的很清楚)
WM_CLOSE:关闭应用程序窗口 WM_DESTROY:关闭应用程序 WM_QUIT:关闭消息循环 只有关闭了消息循环,应用程序的进程才真正退出(在任务管理器里消失). win32应用程序的完整退出 ...
- [Android学习笔记]ScrollView的使用
竖直滚动使用ScrollView 水平滚动使用HorizontalScrollView 如果需要禁止ScrollView的滚动,则需要扩展ScrollView类,重写onTouchEvent方法.