# Android-InfiniteCards **Repository Path**: bakerj/Android-InfiniteCards ## Basic Information - **Project Name**: Android-InfiniteCards - **Description**: 可自定义动效的卡片切换视图 - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: https://github.com/BakerJQ/Android-InfiniteCards - **GVP Project**: No ## Statistics - **Stars**: 17 - **Forks**: 0 - **Created**: 2017-07-28 - **Last Updated**: 2024-11-22 ## Categories & Tags **Categories**: android-modules **Tags**: None ## README # InfiniteCards [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html) 可自定义动效的卡片切换视图 实现思路:http://bakerjq.com/2017/05/28/20170528_InfiniteCard/ ## 截屏 ![](./screenshot/sample.gif) ## Gradle引用 ``` groovy compile 'com.bakerj:infinite-cards:1.0.1' ``` ## 参数 - animType : 动效展示类型 - front : 将点击的卡片切换到第一个 - switchPosition : 将点击的卡片和第一张卡片互换位置 - frontToLast : 将第一张卡片移到最后,后面的卡片往前移动一个 - cardRatio : 卡片宽高比 - animDuration : 卡片动效时间 - animAddRemoveDelay : 卡片组切换时,添加与移出时,相邻卡片展示动效的间隔时间 - animAddRemoveDuration : 卡片组切换时,添加与移出时,卡片动效时间 ## 使用 ### xml布局 ```xml ``` ### 设置Adapter 直接继承BaseAdapter ```java class MyAdapter extends BaseAdapter{ ... } mAdapter = new MyAdapter(resId); mCardView.setAdapter(mAdapter); ``` ### 动效的转换和插值 #### 默认 默认情况下可以不设置,或者设置为各种Default ```java mCardView.setAnimInterpolator(new LinearInterpolator()); mCardView.setTransformerToFront(new DefaultTransformerToFront()); mCardView.setTransformerToBack(new DefaultTransformerToBack()); mCardView.setZIndexTransformerToBack(new DefaultZIndexTransformerCommon()); ``` #### 自定义 通过设置转换器与插值器,根据回调中的参数自定义动画效果 ```java mCardView.setTransformerToBack(new AnimationTransformer() { @Override public void transformAnimation(View view, float fraction, int cardWidth, int cardHeight, int fromPosition, int toPosition) { int positionCount = fromPosition - toPosition; float scale = (0.8f - 0.1f * fromPosition) + (0.1f * fraction * positionCount); ViewHelper.setScaleX(view, scale); ViewHelper.setScaleY(view, scale); if (fraction < 0.5) { ViewCompat.setRotationX(view, 180 * fraction); } else { ViewCompat.setRotationX(view, 180 * (1 - fraction)); } } @Override public void transformInterpolatedAnimation(View view, float fraction, int cardWidth, int cardHeight, int fromPosition, int toPosition) { int positionCount = fromPosition - toPosition; float scale = (0.8f - 0.1f * fromPosition) + (0.1f * fraction * positionCount); ViewHelper.setTranslationY(view, -cardHeight * (0.8f - scale) * 0.5f - cardWidth * (0.02f * fromPosition - 0.02f * fraction * positionCount)); } }); mCardView.setZIndexTransformerToBack(new ZIndexTransformer() { @Override public void transformAnimation(CardItem card, float fraction, int cardWidth, int cardHeight, int fromPosition, int toPosition) { if (fraction < 0.4f) { card.zIndex = 1f + 0.01f * fromPosition; } else { card.zIndex = 1f + 0.01f * toPosition; } } @Override public void transformInterpolatedAnimation(CardItem card, float fraction, int cardWidth, int cardHeight, int fromPosition, int toPosition) { } }); ```