iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android Animation实战之一个APP的ListView的动画效果
  • 567
分享到

Android Animation实战之一个APP的ListView的动画效果

listviewanimationapp动画Android 2022-06-06 09:06:12 567人浏览 泡泡鱼
摘要

熟悉了基础动画的实现后,便可以试着去实现常见APP中出现过的那些精美的动画。今天我主要给大家引入一个APP的ListView的动画效果: 当展示ListView时,Listvi

熟悉了基础动画的实现后,便可以试着去实现常见APP中出现过的那些精美的动画。今天我主要给大家引入一个APP的ListView的动画效果: 当展示ListView时,Listview的每一个列表项都按照规定的动画显示出来。
说起来比较抽象,先给大家看一个动画效果,这是APP窝牛装修的ListView显示动画:

   

有木有觉得很酷炫?有木有啊!?

一、Layout Animation
    所谓的布局动画,其实就是为ViewGroup添加显示动画效果,主要用过LayoutAnimationController来控制实现。LayoutAnimationController用于为一个Layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果,可以在XML文件中设置,亦可以在Java代码中设置。

1.1 在XML文件中设置布局动画

  首先,我们在res/anim文件夹下建立一个list_anim_layout.xml文件,该文件就是布局动画控制器。


<layoutAnimation xmlns:Android="Http://schemas.android.com/apk/res/android" 
  android:delay="30%" 
  android:animationOrder="random" 
  android:animation="@anim/slide_right" /> 

android:delay  子类动画时间间隔 (延迟)   70% 也可以是一个浮点数 如“1.2”等。
android:animationOrder="random"   子类的显示方式 random表示随机。
android:animationOrder 的取值有 

     nORMal 0    默认
     reverse 1 倒序
     random 2   随机

android:animation="@anim/slide_right" 表示列表项显示时的具体动画是什么!
下面,我们定义每一个列表项显示时的动画效果吧,及slide_right.xml:


<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
  android:interpolator="@android:anim/accelerate_interpolator"> 
  <translate 
    android:duration="3000" 
    android:fromXDelta="100%p" 
    android:toXDelta="0%p" /> 
</set> 

显示的效果为ListView第一次出现的时候为 item随机出现 每个Item都是从右边的区域向左滑动到显示的地方。
接下来,你只需要把这个布局动画,指定到ViewGroup上就好了:


<ListView 
    android:id="@+id/listView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layoutAnimation="@anim/list_anim_layout" 
    > 
</ListView> 

就这么简单就完成了,快来看下效果吧:

1.2 在Java代码中实现布局动画
    在Java代码中实现布局动画并无难度,只要熟悉几个api的使用即可。 关于动画的定义和上文一致,只是,你不需要再在把控制动画应用到listview中了,即android:layoutAnimation="@anim/list_anim_layout"这行代码可以删除。
    接下来,需要在Java代码中进行配置:


private void startLayoutAnim() { 
  //通过加载XML动画设置文件来创建一个Animation对象; 
  Animation animation = AnimationUtils.loadAnimation(this, R.anim.slide_right); 
  //得到一个LayoutAnimationController对象; 
  LayoutAnimationController lac = new LayoutAnimationController(animation); 
  //设置控件显示的顺序; 
  lac.setOrder(LayoutAnimationController.ORDER_REVERSE); 
  //设置控件显示间隔时间; 
  lac.setDelay(1); 
  //为ListView设置LayoutAnimationController属性; 
  listView.setLayoutAnimation(lac); 
} 

    观察下,效果和之前使用xml文件肯定是一致的了。    

    介绍到这里,可能有人会有疑问了,博文一开始介绍的“窝牛装修”的那种效果,是每一个列表项显示的时候才会显示动画。我们这个确实所有的列表项的动画一起都显示了,只是显示顺序不同而已。 通过我们这种方法,怎么可能会达到那种效果呢?
    确实,通过布局动画,没办法控制每一个Item在加载时才显示动画。那该如何是好呢?
    兄弟们,换个思路吧,如果布局动画完成不了,何必不直接用简单的补间动画,再结合每个列表项的显示控制,来实现窝牛装修列表显示的效果呢? 
    那有人会问了,怎么知道每一个列表项何时才加载么?
    你难道忘了BaseAdapter的getView()方法了么?
    没错,每当一个列表项显示时,都会主动调用BaseAdaper的getView()方法。

二、仿窝牛装修List列表的动画效果
    首先,我们定义一个动画资源,该动画即是列表项显示时的动画:woniu_list_item.xml


<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
  android:interpolator="@android:anim/accelerate_interpolator" 
  > 
  <!--  woniu list item animation  --> 
  <translate 
    android:duration="500" 
    android:fromXDelta="0" 
    android:fromYDelta="100" 
    android:toXDelta="0" 
    android:toYDelta="0" /> 
</set> 

    该平移动画表示,从下往上,垂直平移100px,时间为500毫秒。
    接下来,我们需要在BaseAdapter的getView()方法里,去使用该动画:


import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 
import java.util.List; 
public class WoniuListAdapter extends BaseAdapter { 
  private Context mContext; 
  private LayoutInflater mInflater; 
  private List<WoniuSimple> mDatas; 
  private Animation animation; 
  public WoniuListAdapter(Context context, List<WoniuSimple> datas) { 
    mContext = context; 
    mInflater = LayoutInflater.from(mContext); 
    mDatas = datas; 
    animation = AnimationUtils.loadAnimation(mContext, R.anim.woniu_list_item); 
  } 
  @Override 
  public int getCount() { 
    return (mDatas != null ? mDatas.size() : 0); 
  } 
  @Override 
  public Object getItem(int position) { 
    return (mDatas != null ? mDatas.get(position) : null); 
  } 
  @Override 
  public long getItemId(int position) { 
    return position; 
  } 
  @Override 
  public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    int type = getItemViewType(position); 
    if (convertView == null) { 
      // 下拉项布局 
      convertView = mInflater.inflate(R.layout.list_item_woniu, null); 
      holder = new ViewHolder(); 
      holder.tem_img = (ImageView) convertView.findViewById(R.id.tem_img); 
      holder.text_name = (TextView) convertView.findViewById(R.id.text_name); 
      holder.text_name = (TextView) convertView.findViewById(R.id.text_name); 
      convertView.setTag(holder); 
    } else { 
      holder = (ViewHolder) convertView.getTag(); 
    } 
    convertView.startAnimation(animation); 
    final WoniuSimple materialSimple = mDatas.get(position); 
    if (materialSimple != null) { 
//      holder.tem_img.setImageResource(R.mipmap.assist_default_img); 
//      holder.text_name.setText(materialSimple.name); 
//      holder.text_mobile.setText(materialSimple.mobile); 
    } 
    return convertView; 
  } 
  class ViewHolder { 
    ImageView tem_img; 
    TextView text_name; 
    TextView text_mobile; 
  } 
} 

    我们来简要分析应用动画的地方: 1、我们Adapter的构造方法里加载了之前定义的动画,活的Animation对象。 2、 我们在getView方法里,为convertView设置并启动Animation,即convertView.startAnimation(animation)。
    够简单吧,只是这么两行代码,就可以实现在加载每一个View Item时启动动画效果。
    可是,我们发现,这并不是非常完美的实现,为啥这么说呢?
    因为你此刻往上滑动列表,会发现,已经加载过的Item的动画还会再次启动执行一次。这个体验太糟糕了。为啥会出现这种情况啊?
    因为getVIew方法的调用时机会对动画产生影响。Adapter中的getView方法,会在每一个item处于可见状态时调用,所以无论你上滑还是下滑,都会重复调用getView方法(这也是ListView为啥在使用时要进行优化的地方)。
    所以,为了解决刚刚发生的问题,我们可以设置标识,进行判断,已经加载过的view的动画不再进行启动加载。
    完整的代码如下:


package com.lnyp.layoutanimation; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
public class WoniuListAdapter extends BaseAdapter { 
  private Context mContext; 
  private LayoutInflater mInflater; 
  private List<WoniuSimple> mDatas; 
  private Animation animation; 
  private Map<Integer, Boolean> isFrist; 
  public WoniuListAdapter(Context context, List<WoniuSimple> datas) { 
    mContext = context; 
    mInflater = LayoutInflater.from(mContext); 
    mDatas = datas; 
    animation = AnimationUtils.loadAnimation(mContext, R.anim.woniu_list_item); 
    isFrist = new HashMap<Integer, Boolean>(); 
  } 
  @Override 
  public int getCount() { 
    return (mDatas != null ? mDatas.size() : 0); 
  } 
  @Override 
  public Object getItem(int position) { 
    return (mDatas != null ? mDatas.get(position) : null); 
  } 
  @Override 
  public long getItemId(int position) { 
    return position; 
  } 
  @Override 
  public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder = null; 
    int type = getItemViewType(position); 
    if (convertView == null) { 
      // 下拉项布局 
      convertView = mInflater.inflate(R.layout.list_item_woniu, null); 
      holder = new ViewHolder(); 
      holder.tem_img = (ImageView) convertView.findViewById(R.id.tem_img); 
      holder.text_name = (TextView) convertView.findViewById(R.id.text_name); 
      holder.text_name = (TextView) convertView.findViewById(R.id.text_name); 
      convertView.setTag(holder); 
    } else { 
      holder = (ViewHolder) convertView.getTag(); 
    } 
    // 如果是第一次加载该view,则使用动画 
    if (isFrist.get(position) == null || isFrist.get(position)) { 
      convertView.startAnimation(animation); 
      isFrist.put(position, false); 
    } 
    final WoniuSimple materialSimple = mDatas.get(position); 
    if (materialSimple != null) { 
//      holder.tem_img.setImageResource(R.mipmap.assist_default_img); 
//      holder.text_name.setText(materialSimple.name); 
//      holder.text_mobile.setText(materialSimple.mobile); 
    } 
    return convertView; 
  } 
  class ViewHolder { 
    ImageView tem_img; 
    TextView text_name; 
    TextView text_mobile; 
  } 
} 

     看到了么,加了一个isFirst进行判断,这样,就可以有效控制动画的显示了。效果如下:


     本文我主要介绍了两个部分,一个是Layout Animation布局动画,使用布局动画可以控制VIew Groups中的每一个数据的显示动画; 还一个就是实战,仿“窝牛装修”ListView滑动时每一个Item滑动进入可见状态的动画效果。通过这两个动画示例,我相信可以帮助大家更好的处理动画,克服“动画恐惧症”。

希望本文所述对大家学习有所帮助,大家也会喜欢,小编一定会再接再厉,为大家分享更多精彩的文章。

您可能感兴趣的文章:Android自定义Animation实现View摇摆效果Android使用glide加载gif动画设置播放次数Android Glide图片加载(加载监听、加载动画)Android实现跳动的小球加载动画效果Android自定义加载loading view动画组件Android自定义加载控件实现数据加载动画Android加载Gif动画实现代码Android自定义view实现阻尼效果的加载动画Android自定义View实现loading动画加载效果Android使用View Animation实现动画加载界面


--结束END--

本文标题: Android Animation实战之一个APP的ListView的动画效果

本文链接: https://www.lsjlt.com/news/25886.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • css动画效果之animation的常用样式有哪些
    这篇文章主要为大家展示了css动画效果之animation的常用样式有哪些,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“css动画效果之animation的常用样式有哪些”这篇文章吧。animat...
    99+
    2023-06-08
  • Android中怎么使用ListView实现滚轮动画效果
    今天就跟大家聊聊有关Android中怎么使用ListView实现滚轮动画效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。   private ...
    99+
    2023-05-31
    android listview
  • Android项目实战之ListView悬浮头部展现效果实现
    目录实现效果:我们先分析要解决的问题:解决:代码实现:总结实现效果: 先看下效果:需求是 滑动列表 ,其中一部分视图(粉丝数,关注数这一部分)在滑动到顶端的时候不消失,而是停留在整个...
    99+
    2024-04-02
  • 怎么在Android应用中实现一个动画效果
    本篇文章给大家分享的是有关怎么在Android应用中实现一个动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android 三种动画详解帧动画一张张图片不断的切换,形成动...
    99+
    2023-05-31
    android roi
  • 如何基于CSS3的animation属性实现微信拍一拍动画效果
    小编给大家分享一下如何基于CSS3的animation属性实现微信拍一拍动画效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!看到最近流行的微信拍一拍功能,复习下...
    99+
    2023-06-08
  • 如何在Android中利用ConstraintLayout实现一个动画效果
    这篇文章将为大家详细讲解有关如何在Android中利用ConstraintLayout实现一个动画效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。xml布局:<!-- activit...
    99+
    2023-05-31
    android constraintlayout roi
  • Android如何实现直播app送礼物连击动画效果
    这篇文章将为大家详细讲解有关Android如何实现直播app送礼物连击动画效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近在做公司的直播项目,需要实现一个观看端连击送礼物的控件:直接上代码:publ...
    99+
    2023-05-31
    android
  • CSS如何实现一个loading动画效果
    这篇文章主要介绍CSS如何实现一个loading动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!曾经以为,loading的制作需要一些比较高深的web动画技术,后来发现大多数loading都可以用“障眼法”做出...
    99+
    2023-06-08
  • 基于CSS3的animation动画属性如何实现轮播图效果
    这篇文章将为大家详细讲解有关基于CSS3的animation动画属性如何实现轮播图效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。animation简介:CSS3的an...
    99+
    2024-04-02
  • CSS+jQuery实现的一个放大缩小动画效果
    今天帮朋友写了一些代码,自己觉得写着写着,好几个版本以后,有点满意,于是就贴出来。 都是定死了的。因为需求就只有4个元素。如果是要用CSS的class来处理,那就需要用到CSS3动画...
    99+
    2022-11-15
    jQuery+CSS 放大缩小动画
  • WPF实现动画效果(一)之基本概念
    WPF动画效果系列 WPF实现动画效果(一)之基本概念 WPF实现动画效果(二)之From/To/By 动画 WPF实现动画效果(三)之时间线(TimeLine) WPF实现动画效果...
    99+
    2024-04-02
  • 如何实现一个全屏的加载动画效果
    本篇内容主要讲解“如何实现一个全屏的加载动画效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现一个全屏的加载动画效果”吧!  这个效果的核心是让一个形状...
    99+
    2024-04-02
  • 如何在Android应用中利用Dialog实现一个动画效果
    今天就跟大家聊聊有关如何在Android应用中利用Dialog实现一个动画效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 创建两个动画文件window_in.xml:<&a...
    99+
    2023-05-31
    android dialog roi
  • Android开发中利用ListView实现一个渐变式的下拉刷新动画
    本篇文章给大家分享的是有关Android开发中利用ListView实现一个渐变式的下拉刷新动画,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。主要要点listview刷新过程中主...
    99+
    2023-05-31
    android listview roi
  • 利用Android实现一种点赞动画效果的全过程
    目录前言点击后的缩放效果拇指的散开效果示例总结前言 最近有个需求,需要仿照公司的H5实现一个游戏助手,其中一个点赞的按钮有动画效果,如下图: 分析一下这个动画,点击按钮后,拇指首先...
    99+
    2022-12-08
    android 点赞动画 android点赞效果 android点击动画
  • android开发中如何利用listview实现一个悬浮topBar效果
    android开发中如何利用listview实现一个悬浮topBar效果?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。虽然listview是过去式,但由于项目中还是有用list...
    99+
    2023-05-31
    android listview topbar
  • 如何在android中利用listview实现一个列表展示效果
    今天就跟大家聊聊有关如何在android中利用listview实现一个列表展示效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。设置条目点击事件package com.it...
    99+
    2023-05-31
    android listview roi
  • 怎么在Android应用中实现一个加载数据帧动画效果
    这期内容当中小编将会给大家带来有关怎么在Android应用中实现一个加载数据帧动画效果,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现步骤:1、xml布局<&#63;xml version...
    99+
    2023-05-31
    android roi
  • 怎么在Android中使用ScrollView实现一个下拉弹回动画效果
    本篇文章给大家分享的是有关怎么在Android中使用ScrollView实现一个下拉弹回动画效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Android是什么Android...
    99+
    2023-05-30
    android scrollview
  • 如何在Android中实现一个动画效果的自定义下拉菜单功能
    如何在Android中实现一个动画效果的自定义下拉菜单功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。要实现的功能及思路如下:下拉菜单样式是自定义的、非原生效果:需要使用...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作