Android属性动画实现图片从左到右逐渐消失
前言:dp/dip代表独立像素,dpi代表屏幕每英寸像素点的个数,px与dp的转换公式为:px=dp*(dpi/160)
一、效果图
二、源代码
AnimationActivity:
packagecom.example.duoyi.clientaidl;
importandroid.animation.Animator;
importandroid.animation.ObjectAnimator;
importandroid.support.annotation.NonNull;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.support.v7.widget.CardView;
importandroid.support.v7.widget.LinearLayoutManager;
importandroid.support.v7.widget.RecyclerView;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.ImageView;
importcom.example.duoyi.AnimationAdapter;
importjava.util.ArrayList;
importjava.util.List;
publicclassAnimationActivityextendsAppCompatActivity{
privatestaticfinalintMAX_COUNT=100;
privatestaticfinalStringTAG="AnimationActivity";
RecyclerViewrv;
CardViewcv;
ImageViewimage;
ObjectAnimatoranimator;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
rv=findViewById(R.id.itemRv);
cv=findViewById(R.id.expand);
image=findViewById(R.id.insect);
Listlist=newArrayList<>();
for(inti=0;i
activity_animator.xml:
item_anim.xml:
AnimatorAdapter.java:
packagecom.example.duoyi;
importandroid.content.Context;
importandroid.support.annotation.NonNull;
importandroid.support.v7.widget.RecyclerView;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TextView;
importcom.example.duoyi.clientaidl.AnimationActivity;
importcom.example.duoyi.clientaidl.R;
importjava.util.List;
publicclassAnimationAdapterextendsRecyclerView.Adapter{
privateListlist;
privateAnimationActivitycontext;
publicAnimationAdapter(Listlist,AnimationActivitycontext){
this.list=list;
this.context=context;
}
@Override
publicAnimationViewHolderonCreateViewHolder(ViewGroupviewGroup,inti){
Viewview=LayoutInflater.from(context).inflate(R.layout.item_anim,viewGroup,false);
returnnewAnimationViewHolder(view);
}
@Override
publicvoidonBindViewHolder(AnimationViewHolderholder,intposition){
Stringcontent=list.get(position);
holder.content.setText(content);
}
@Override
publicintgetItemCount(){
returnlist.size();
}
staticclassAnimationViewHolderextendsRecyclerView.ViewHolder{
TextViewcontent;
AnimationViewHolder(Viewview){
super(view);
content=view.findViewById(R.id.content);
}
}
}
三、逻辑分析
首先实现的效果是图片从做到右显示,那我们就使用平移动画,让图片从左到右移动消失,所以就在需要显示ImageView嵌套一层父容器,这样图片不断移出容器的范围内就会造成一种图片从左到右消失的效果
需求:父容器需设置为圆角显示
如果需要实现ImageView的父容器为圆角布局的话,那就采用CardView,通过改变其属性
app:cardCornerRadius="15dp"
实现,不要使用其他诸如LinearLayout的父容器,设置其backgroud为一个圆角的drawable方式实现,这样的话内部的图片如果是矩形,即时你设置了父容器为圆角的,但是内部图片的显示还是会超出圆角的范围显示
需求:图片消失的动画中响应点击事件,完整显示另一张图片
这个实现我们首先需要在图片的点击事件中判断当前动画是否还是运行isRunning(),如果运行的话调用animator的cancel()方法取消动画,然后进行图片的位置的复位;如果我们不进行复位操作,此时ImageView的位置由于平移动画发生改变,当我们显示另一张图片可能会发生显示不全情况
当动画终止(可能自然终止,也可能调用了动画的cance()方法),会响应其结束的监听方法,然后我们在该方法复位图片的位置即可:
animator.addListener(newAnimator.AnimatorListener(){
@Override
publicvoidonAnimationStart(Animatoranimation){
}
@Override
publicvoidonAnimationEnd(Animatoranimation){
//当图片发生点击时可以通过下面代码将图片复位到原来位置
//否则响应点击事件的图片可能会显示不全,不响应点击的忽略
//image.setTranslationX(dp2px(-1));
}
@Override
publicvoidonAnimationCancel(Animatoranimation){
}
@Override
publicvoidonAnimationRepeat(Animatoranimation){
}
});
动画实现的两种方式:
直接通过组件的animator()方式可以实现动画的链式调用,并且可以通过其withEndAction()或者withStartAction()方法在动画启动和结束的时候执行一些逻辑,该方式可以不需要调用其start()就能执行,因为其会在屏幕刷新的时候会自动执行
//第一种动画方式
image.animate()
.translationX(dp2px(50))
.setDuration(1500)
.start();
下面这种方式就是比较老实的方式,但是我们可以通过将其赋值给一个全局变量进行动画的操控(pause()cancel())
animator=ObjectAnimator.ofFloat(image,"translationX",
dp2px(50));
animator.setDuration(1500);
animato.start();
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。