当前位置: 首页 > 科技观察

Android图片放大缩小动画就是这么简单

时间:2023-03-20 02:17:27 科技观察

有这样的需求,需要点击图片放大缩小动画,效果:我们可以轻松实现初始化对象Animationanimation;privateImageViewiv_good;animation=AnimationUtils.loadAnimation(这个,R.anim.anim_small);按钮点击事件iv_good.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){iv_good.startAnimation(animation);}});属性动画res/anim/anim_small.xml我们重点关注AnimationUtils类中的loadAnimation方法,后续看/***Loadsan{@linkAnimation}objectfromaresource**@paramcontextApplicationcontextusedtoaccessresources*@paramidTheresourceidoftheanimationtoload*@returnTheanimationobjectreferencebythespecifiedidhen@throwsNotFoundedEx/publicstaticAnimationloadAnimation(Contextcontext,@AnimResintid)throwsNotFoundException{XmlResourceParserparser=null;try{parser=context.getResources().getAnimation(id);returncreateAnimationFromXml(context,parser);}catch(XmlPullParserExceptionex){NotFoundExceptionanFontreload'NotFoundException#0x"+Integer.toHexString(id)));rnf.initCause(ex);throwrnf;}catch(IOExceptionex){NotFoundExceptionrnf=newNotFoundException("Can'tloadanimationresourceID#0x"+Integer.toHexString(id));rnf.initCause(ex);throwrnf;}最后{if(parser!=null)parser.close();}}我们发现调用createAnimationFromXml方法并再次跟进createAnimationFromXml方法很重要。privatestaticAnimationcreateAnimationFromXml(Contextc,XmlPullParserparser)throwsXmlPullParserException,IOException{returncreateAnimationFromXml(c,parser,null,Xml.asAttributeSet(parser));}privatestaticAnimationcreateAnimationFromXml(Contextc,XmlPullParserparser,AnimationSetparent,AttributeSetattrs)throwsXmlPullParserException,IOException{Animationanim=null;//Makesureweareonastarttag.inttype;intdepth=parser.getDepth();while(((type=parser.next())!=XmlPullParser.END_TAG||parser.getDepth()>depth)&&type!=XmlPullParser.END_DOCUMENT){if(type!=XmlPullParser.START_TAG){continue;}Stringname=parser.getName();if(name.equals("set")){anim=newAnimationSet(c,attrs);createAnimationFromXml(c,parser,(AnimationSet)anim,attrs);}elseif(name.equals("alpha")){anim=newAlphaAnimation(c,attrs);}elseif(name.equals("scale")){anim=newScaleAnimation(c,attrs);}elseif(name.equals("旋转")){anim=newRotateAnimation(c,attrs);}elseif(name.equals("translate")){anim=newTranslateAnimation(c,attrs);}else{thrownewRuntimeException("Unknownanimationname:"+parser.getName());}if(parent!=null){parent.addAnimation(anim);}}returnanim;}细心的你不难发现,XmlPullParser其实就是我们上面定义的anim_small.xml,解析出这个xml中的属性,进行加载动画效果。Android系统已经帮我们分析打包好了,我们只需要使用轮子。/***将儿童动画添加到此动画集。*儿童动画的变换应用顺序*他们被添加*@paramaAnimationtoadd。*/publicvoidaddAnimation(Animationa){mAnimations.add(a);booleannoMatrix=(mFlags&PROPERTY_MORPH_MATRIX_MASK)==0;if(noMatrix&&a.willChangeMAPERSKMPROX_Flag());}booleanchangeBounds=(mFlags&PROPERTY_CHANGE_BOUNDS_MASK)==0;if(changeBounds&&a.willChangeBounds()){mFlags|=PROPERTY_CHANGE_BOUNDS_MASK;}if((mFlags&PROPERTY_DURATION_MASK)==PROPERTY_DURATION_MASK){mLastEnd=mStartOffset+mDuration(()==1){mDuration=a.getStartOffset()+a.getDuration();mLastEnd=mStartOffset+mDuration;}else{mLastEnd=Math.max(mLastEnd,a.getStartOffset()+a.getDuration());mDuration=mLastEnd-mStartOffset;}}mDirty=true;}分享这个小例子的初衷是希望大家能够跟进,看到一个小知识点的实现过程,了解过程。我的五脏六腑都有,希望对你有帮助。【本文为专栏作家“洪盛鹏”原创稿件,转载请联系原作者】点此阅读更多该作者好文