Comments (19)
没太明白你的意思,你是指demo里的style1和style2么,这两个有些步骤下动画是有一样的
from android-infinitecards.
具体来说是这样,我的程序中有style1,style2,style3这三种动画模式(与demo中一致)。 首先,初始化的时候我定义的是style2动画效果,这时手指点击mCardView会有两个卡片交换的效果。然后,我在给一个button设置事件,先设置style1模式,在让第二张卡片移动到第一个位置。重点是,我在button事件的末尾又加上了setStyle2; 但是之后我在用手指点击mCardView时,它的效果并不是style2,而是style1(与button的时间一样)。
from android-infinitecards.
方便贴一下代码么
from android-infinitecards.
okok,我就放在这里,我的按钮用的是第三方的fab...
public class ColorFragment extends Fragment implements View.OnClickListener {
private InfiniteCardView mCardView;
private BaseAdapter mAdapter;
private FabOptions fabOptions;
private int[] resId = {R.color.colorPrimary, R.color.colorAccent,R.color.colorPrimaryDark};
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_colorpanel, container, false);
mCardView = (InfiniteCardView)view.findViewById(R.id.cardview);
fabOptions = (FabOptions)view.findViewById(R.id.fab_options);
init();
return view;
}
private void init(){
mAdapter = new MyAdapter(resId);
setStyle2();
mCardView.setAdapter(mAdapter);
fabOptions.setBackgroundColor(R.color.colorPrimary);
fabOptions.setButtonsMenu(R.menu.menu_faboptions);
fabOptions.setFabColor(R.color.colorPrimary);
fabOptions.setOnClickListener(this);
}
private void setStyle1() {
mCardView.setClickable(true);
mCardView.setAnimType(InfiniteCardView.ANIM_TYPE_FRONT);
mCardView.setAnimInterpolator(new OvershootInterpolator(-18));
mCardView.setTransformerToFront(new DefaultTransformerToFront());
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) {
}
});
}
private void setStyle2() {
mCardView.setClickable(true);
mCardView.setAnimType(InfiniteCardView.ANIM_TYPE_SWITCH);
mCardView.setAnimInterpolator(new OvershootInterpolator(-18));
mCardView.setTransformerToFront(new DefaultTransformerToFront());
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) {
}
});
}
private void setStyle3() {
mCardView.setClickable(true);
mCardView.setAnimType(InfiniteCardView.ANIM_TYPE_FRONT_TO_LAST);
mCardView.setAnimInterpolator(new OvershootInterpolator(-8));
mCardView.setTransformerToFront(new DefaultCommonTransformer());
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.setTranslationX(view, cardWidth * fraction * 1.5f);
ViewCompat.setRotationY(view, -45 * fraction);
} else {
ViewCompat.setTranslationX(view, cardWidth * 1.5f * (1f - fraction));
ViewCompat.setRotationY(view, -45 * (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.5f) {
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) {
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.faboptions_pre:
setStyle1();
mCardView.bringCardToFront(mAdapter.getCount() - 1);
break;
case R.id.faboptions_next:
setStyle3();
mCardView.bringCardToFront(1);
break;
case R.id.faboptions_clear:
if (mCardView.isAnimating()) {
return;
}
setStyle2();
mCardView.setAdapter(mAdapter);
break;
case R.id.faboptions_share:
break;
default:
// no-op
}
setStyle2();//我提的就是这句话
}
private static class MyAdapter extends BaseAdapter {
private int[] resIds = {};
MyAdapter(int[] resIds) {
this.resIds = resIds;
}
@Override
public int getCount() {
return resIds.length;
}
@Override
public Integer getItem(int position) {
return resIds[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout
.item_card, parent, false);
}
convertView.setBackgroundResource(resIds[position]);
return convertView;
}
}
}
from android-infinitecards.
在onClick()(fab的点击事件)的末尾我用了setStyle2();我感觉之后我在手动点击mCardView应该还是style2啊。。。
from android-infinitecards.
ok,原因是这样的,你可以到CardAnimationHelper类中看一下,所有设置“style”的方法都有一个前置判断,就是当前不在动画状态下,所以你开始了动画后,立马设置另一个style是无效的,因为当前动画还没结束。之所以这样做,是为了防止一个动画过程中,立马设置另一个动画而导致动画效果错乱。
from android-infinitecards.
那么我怎么能在动画结束后设置style呢?
from android-infinitecards.
用一个while循环?我试试啊。。。
from android-infinitecards.
建议不要这样,目前你可以在设置的transformer中,判断fraction是否为1来确定当前动画是否完成,我会考虑加一个listener,来监听动画是否完成
from android-infinitecards.
另外你可以看下这篇文章,里面介绍了一下实现这个库的思路
http://bakerjq.com/2017/05/28/20170528_InfiniteCard/
from android-infinitecards.
多谢指点,我会看的!
from android-infinitecards.
不谢,加了listener后我会在issue里告诉你再close
from android-infinitecards.
欧克欧克,还是得谢...
from android-infinitecards.
已经加入动画listener
from android-infinitecards.
已收到,您没有在gradle上面更新版本,我怎么使用?
from android-infinitecards.
今天jcenter那一直传不上。。。你可以先直接下下来导包吧。。。后面会传上去
from android-infinitecards.
哈哈,可以的,我先用AAR包了,以后估计懒得换了。。。。。
from android-infinitecards.
已经更新到jCenter了,1.0.2
from android-infinitecards.
多谢LZ^_^
from android-infinitecards.
Related Issues (20)
- Is it possible for the cards to be angled by default? HOT 5
- only show one card to view HOT 2
- java.lang.NullPointerException: HOT 1
- Does it support manual sliding HOT 1
- Can I implement swipe action on the items. HOT 12
- Show selected items from list on the view HOT 1
- View taking padding by default HOT 5
- Delay in swap animation due to late UI rendering. HOT 22
- How to change the size of each card? HOT 1
- How can i replace an element in an array keeping style?
- Can we add swipe action in cards? HOT 3
- 如果要循环滚动,怎么是性能消耗最低 HOT 1
- Multiple card switches with 1 click?
- how to reverse the layout HOT 1
- 这个可以左右滑动么? HOT 4
- 动画效果问题 HOT 4
- Remove a card from stack HOT 1
- 请问可以固定显示的个数吗? HOT 1
- Front to back animation HOT 9
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from android-infinitecards.