可删除超炫&多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载

      

实例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;
                        }
                    });
        }
    }

这里主要关注showUndoBarhideUndoBarUndoBarController这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点击下载

时间: 2024-10-12 23:50:21

可删除超炫&amp;多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载的相关文章

可删除超炫&amp;多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载

       这里贴几个效果图,我做了一个gif的动态图,但是不知道为什么上传后图片不动,所以只能放在相册里. 如果大家想看动态的图片演示请点击后面的链接gif动态演示图片 实例Demo下载地址在本文最后 简单介绍 这个Demo主要是使用了cardsui-for-android开源项目,并且做了一些优化和改进: 1.自定义card视图 2.添加长按事件,避免误操作 3.长按后可以删除card,并播放选中动画 4.删除后浮现一个悬浮button 5.点击悬浮button可以恢复之前删除的card视

css3-rotate实现超炫环形旋转特效

css3-rotate实现超炫环形旋转特效,css3特效,环形旋转,圆形旋转,css3-rotate实现超炫环形旋转特效是一款采用css3 rotate实现的蓝色环形旋转特效代码. http://www.huiyi8.com/css3/

3D HTML5 Logo标志 超炫酷旋转特效

今天又要为大家带来一款超酷的HTML5 Canvas 3D动画特效,是一款可以旋转的HTML5 Logo标志.画面上一共有两块可旋转的区域,第一是可旋转的背景,第二则是可旋转的Logo标志.Logo标志在旋转的时候还有3D的视觉效果,这一切我们都是在canvas上实现的.具体演示和实现过程可以看下文. 你也可以在这里查看在线演示 下面我们来简单分析一下实现这款3D动画的过程及其部分核心代码,主要由HTML代码以及Javascript代码组成. HTML代码: <canvas id="can

【Android开源项目解析】RecyclerView侧滑删除粒子效果实现——初探Android开源粒子库 Leonids

前两天在微博上看到了这个侧滑删除的粒子效果,但是只有IOS的,所以心血来潮,写了个玩玩,下面简单介绍下实现的思路 项目简介 实现原理解析 代码实现 如何使用 更多参考 项目简介 先不废话,上效果图 项目地址:https://github.com/ZhaoKaiQiang/ParticleLayout 实现原理解析 其实看了那么多的关于侧滑删除的项目,再来思考这个问题,就so easy了! 咱们先分析下需求: - 侧滑手势检测 - 粒子跟手效果 - 删除状态判断 - 数据源刷新 ok,知道需求了,

论一款炫酷 Android 开源项目的修炼之路(上)

写在前面 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 Github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看到页面汇中有好多的彩色标签,看起来很酷,很专业,很有逼格,能提升很多的好感度. 前言 本文是一篇很长的文章,其中有很多是素材图片,务必做到每个细节笔者都实践一遍.考虑到大家时间有限,各取所需,所以按照笔者的惯例,首先发布一篇完整版,其次,有一篇缩略版.但本文这次缩略版不好做,所以综合考虑,把每个单独的知识点拆分出来,抓住重点,尽量让大家看的开

论一款炫酷 Android 开源项目的修炼之路(下)

Travis CI 的使用 官网: http://travis-ci.org/ ps: 这个是公开的,如果需要使用私有的,请使用 .com 域名. 需要提醒的是:每次提交代码后都会重新下载需要的资源文件哦,所以时间很长,耐心等待吧. TravisCI 有什么用? travis-ci 就是 自动化 CI 工具,类似于大公司经常使用的 Jenkins,但是 travis-ci 是在云端的,而是支持 github, 还免费,我们可以 用 travis-ci 做很多的事情,不仅仅是 编译看 项目有没有问

android 开源项目GuillotineMenu,酷炫的铡刀菜单

开源项目GuillotineMenu使用指南 先上效果图: IDE使用的是Android studio. 首先下载GuillotineMenu项目的library引用到项目中,下载地址: http://download.csdn.net/detail/u012027644/8840527 guillotine.xml:这个XML是菜单的布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout x

一款由jquery实现的超炫的页面加载特效

今天为大家带来一款由jquery实现的超炫的页面加载特效.连续的几个页面分开特效.最后由三维的线条由远至近消失,然后由近至远出现.效果超级梦炫.一起看下效果图: 在线预览   源码下载 实现的代码. html代码: <svg xmlns="http://www.w3.org/2000/svg" viewbox="0 0 1200 600"> <line id="uno" x1="600" y1="0

css3超炫8种loading加载特效

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ