ListView滑动item卡片式推进动画效果
来源:互联网 发布:优雅的淘宝收件人名字 编辑:程序博客网 时间:2024/06/05 00:56
前言——前几天在一款软件上看到list view滑动有这样的效果,觉得挺好看的,效果如下:
然后先去网上搜,发现大多都是说使用layoutAnimation,但使用之后个人觉得效果还是不太理想,动画是有了,可是动画效果只在刚进去时显示一次,然后就不再执行,感觉不大满意。于是后来就想,既然每次滑动都会执行到getview,可不可以在getview里边设置动画呢,试了一下果然可以,下边就来说一说实现思路:
mainActivity的布局,就是一个简单的listview:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.atguigu.listviewdemo.MainActivity"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/listview" /></RelativeLayout>
先创建一个int数组,放六张图的id,
/** * 六张图片 */ private int[] images = {R.drawable.f0, R.drawable.f1 , R.drawable.f2, R.drawable.f3, R.drawable.f4 , R.drawable.f5, R.drawable.f6};
六张图片有点少,可能看不出效果,所以在创建一个大小为50的集合,随机把六张图遍历为50张,
private List<Integer> imageList = new ArrayList();
Random random = new Random(); imageList = new ArrayList(); for (int i = 0; i < 50; i++) { //为了看出效果,把7张图片随机添加到集合中凑50张 imageList.add(images[random.nextInt(7)]); }
然后就是创建adapter以及设置适配器,最主要还是getview方法:
ViewHolder viewHolder; if (convertView == null) { convertView = View.inflate(mContext, R.layout.item_image, null); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder) convertView.getTag(); }viewHolder.ivImage.setImageResource(imageList.get(position));
此处用了view holder,以及butterknife注入:
class ViewHolder { @BindView(R.id.iv_image) ImageView ivImage; ViewHolder(View view) { ButterKnife.bind(this, view); } }
这个是item_image布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/iv_image" android:scaleType="fitXY" /></LinearLayout>
接下来在getview中设置item动画,一行代码即可
convertView.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.list_anim));
效果就出来了:
但此时还不太完美,就是上滑的时候也会执行动画,导致上滑效果有些不太好看
因为getview形参里边的position是屏幕最新显示出来的item所在集合中的位置,所以在这儿可以定义一个成员变量prePosition,来记录上一个item的位置,然后比较position与prePosition的值大小,如果position > prePosition,则为上滑,应该让动画执行,反之,则不执行,代码如下:
private int prePosition = -1;
//如果是上滑,动画执行,如果是下滑,则动画不执行 if(position > prePosition) { convertView.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.list_anim)); prePosition = position; }else { prePosition = position; }
至此卡片动画效果算是完成了,最后贴上完整代码:
public class MainActivity extends AppCompatActivity { @butterknife.BindView(R.id.listview) ListView listview; private MyAdapter adapter; /** * 六张图片 */ private int[] images = {R.drawable.f0, R.drawable.f1 , R.drawable.f2, R.drawable.f3, R.drawable.f4 , R.drawable.f5, R.drawable.f6}; private List<Integer> imageList = new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); butterknife.ButterKnife.bind(this); initData(); } private void initData() { Random random = new Random(); imageList = new ArrayList(); for (int i = 0; i < 50; i++) { //为了看出效果,把7张图片随机添加到集合中凑50张 imageList.add(images[random.nextInt(7)]); } adapter = new MyAdapter(this, imageList); listview.setAdapter(adapter); } private int prePosition = -1; class MyAdapter extends BaseAdapter { private Context mContext; private List<Integer> imageList; public MyAdapter(Context mContext, List<Integer> imageList) { this.mContext = mContext; this.imageList = imageList; } @Override public int getCount() { return imageList.size(); } @Override public Object getItem(int i) { return imageList.get(i); } @Override public long getItemId(int i) { return 0; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder viewHolder; if (convertView == null) { convertView = View.inflate(mContext, R.layout.item_image, null); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.ivImage.setImageResource(imageList.get(position)); //如果是上滑,动画执行,如果是下滑,则动画不执行 if(position > prePosition) { convertView.setAnimation(AnimationUtils.loadAnimation(mContext, R.anim.list_anim)); prePosition = position; }else { prePosition = position; } return convertView; } class ViewHolder { @BindView(R.id.iv_image) ImageView ivImage; ViewHolder(View view) { ButterKnife.bind(this, view); } } }}
一直以来都是看别人的博客,现在我希望自己也可以帮到别人,这是本人的第一篇技术性博客,希望可以帮到其他人,如果发现有错误,欢迎指正!
- ListView滑动item卡片式推进动画效果
- 当滑动ListView时,让当前最后可见的Item在滑进屏幕时有一个推进动画效果~
- 滑动卡片式效果
- 解决Cardlibs卡片式listview,item滑动每次item全部重新载入,导致速度卡顿
- listview左右滑动item效果
- ListView的item动画效果
- SwipeLayout 类似ListView item滑动删除动画
- 滑动删除ListView的Item的效果
- Android--ListView的item水平滑动效果
- iOS滑动卡片动画
- ListView中item删除动画效果
- ListView中item删除动画效果
- Android—ListView Item 展开动画效果
- ListView底部item飞入动画效果
- Android—ListView Item 展开动画效果
- ionic 卡片滑动效果
- APP卡片滑动效果
- 仿探探卡片滑动效果
- android 加密算法与安全
- zookeeper算法研究
- [05]项目实战-PC 端固定布局(5)
- 仿微信小程序多任务栈效果
- lasticsearch 入门:Filebeat 安装及输出数据到 elasticsearch 或 logstash
- ListView滑动item卡片式推进动画效果
- JavaScript 执行上下文和变量对象
- Exception异常处理反模式
- zookeeper 最佳教程
- Atitit 爬虫 node版 attilax
- wampserver无法启动之mysql疑难杂症
- Atitti opencv2.4 实现的人脸检测 attilax总结
- JavaCV1.2环境搭建
- pms包管理服务分析-初步理解