Android图片放大缩小动画,竟如此简单

有这样一个需求,需要点击图片放大缩小动画,效果:

公司专注于为企业提供网站制作、网站设计、微信公众号开发、电子商务商城网站建设,成都小程序开发,软件按需求定制开发等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,成都创新互联更提供一系列网站制作和网站推广的服务。

我们借助Android自带动画Animation ,很容易实现

初始化对象

 
 
 
 
  1. Animation animation; 
  2. private ImageView iv_good; 
  3. animation= AnimationUtils.loadAnimation(this, R.anim.anim_small); 

按钮点击事件

 
 
 
 
  1. iv_good.setOnClickListener(new View.OnClickListener() { 
  2.         @Override 
  3.         public void onClick(View view) { 
  4.             iv_good.startAnimation(animation); 
  5.         } 
  6.     }); 

属性动画

res/anim/anim_small.xml

 
 
 
 
  1.  
  2.     android:fillAfter="false"> 
  3.     
  4.         android:duration="300" 
  5.         android:fromXScale="1" 
  6.         android:fromYScale="1" 
  7.         android:pivotX="50%" 
  8.         android:pivotY="50%" 
  9.         android:toXScale="2" 
  10.         android:toYScale="2" /> 
  11.     
  12.         android:duration="300" 
  13.         android:fromXScale="1" 
  14.         android:fromYScale="1" 
  15.         android:pivotX="50%" 
  16.         android:pivotY="50%" 
  17.         android:startOffset="300" 
  18.         android:toXScale="0.5" 
  19.         android:toYScale="0.5" /> 
  20.  
 
 
 
 
  1.       android:id="@+id/iv_good" 
  2.       android:layout_width="wrap_content" 
  3.       android:layout_height="wrap_content" 
  4.       android:src="@mipmap/ic_good"/> 

下面我们重点来关注AnimationUtils 这个类中loadAnimation的方法,跟进进去看看

 
 
 
 
  1. /** 
  2.     * Loads an {@link Animation} object from a resource 
  3.     * 
  4.     * @param context Application context used to access resources 
  5.     * @param id The resource id of the animation to load 
  6.     * @return The animation object reference by the specified id 
  7.     * @throws NotFoundException when the animation cannot be loaded 
  8.     */ 
  9.    public static Animation loadAnimation(Context context, @AnimRes int id) 
  10.            throws NotFoundException { 
  11.        XmlResourceParser parser = null; 
  12.        try { 
  13.            parser = context.getResources().getAnimation(id); 
  14.            return createAnimationFromXml(context, parser); 
  15.        } catch (XmlPullParserException ex) { 
  16.            NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 
  17.                    Integer.toHexString(id)); 
  18.            rnf.initCause(ex); 
  19.            throw rnf; 
  20.        } catch (IOException ex) { 
  21.            NotFoundException rnf = new NotFoundException("Can't load animation resource ID #0x" + 
  22.                    Integer.toHexString(id)); 
  23.            rnf.initCause(ex); 
  24.            throw rnf; 
  25.        } finally { 
  26.            if (parser != null) parser.close(); 
  27.        } 
  28.    } 

我们发现重要的是调用createAnimationFromXml方法。再次跟进看看createAnimationFromXml方法。

 
 
 
 
  1. private static Animation createAnimationFromXml(Context c, XmlPullParser parser) 
  2.             throws XmlPullParserException, IOException { 
  3.         return createAnimationFromXml(c, parser, null, Xml.asAttributeSet(parser)); 
  4.     } 
 
 
 
 
  1. private static Animation createAnimationFromXml(Context c, XmlPullParser parser, 
  2.             AnimationSet parent, AttributeSet attrs) throws XmlPullParserException, IOException { 
  3.         Animation anim = null; 
  4.         // Make sure we are on a start tag. 
  5.         int type; 
  6.         int depth = parser.getDepth(); 
  7.         while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) 
  8.                && type != XmlPullParser.END_DOCUMENT) { 
  9.             if (type != XmlPullParser.START_TAG) { 
  10.                 continue; 
  11.             } 
  12.             String  name = parser.getName(); 
  13.             if (name.equals("set")) { 
  14.                 anim = new AnimationSet(c, attrs); 
  15.                 createAnimationFromXml(c, parser, (AnimationSet)anim, attrs); 
  16.             } else if (name.equals("alpha")) { 
  17.                 anim = new AlphaAnimation(c, attrs); 
  18.             } else if (name.equals("scale")) { 
  19.                 anim = new ScaleAnimation(c, attrs); 
  20.             }  else if (name.equals("rotate")) { 
  21.                 anim = new RotateAnimation(c, attrs); 
  22.             }  else if (name.equals("translate")) { 
  23.                 anim = new TranslateAnimation(c, attrs); 
  24.             } else { 
  25.                 throw new RuntimeException("Unknown animation name: " + parser.getName()); 
  26.             } 
  27.             if (parent != null) { 
  28.                 parent.addAnimation(anim); 
  29.             } 
  30.         } 
  31.         return anim; 
  32.     } 

细心的你,不难发现XmlPullParser,其实就是我们上面定义的anim_small.xml,解析出这份xml里面的属性,进行加载动画效果。Android系统已经为我们解析分装好,我们只需要使用轮子就好了。

 
 
 
 
  1. /** 
  2.     * Add a child animation to this animation set. 
  3.     * The transforms of the child animations are applied in the order 
  4.     * that they were added 
  5.     * @param a Animation to add. 
  6.     */ 
  7.    public void addAnimation(Animation a) { 
  8.        mAnimations.add(a); 
  9.        boolean noMatrix = (mFlags & PROPERTY_MORPH_MATRIX_MASK) == 0; 
  10.        if (noMatrix && a.willChangeTransformationMatrix()) { 
  11.            mFlags |= PROPERTY_MORPH_MATRIX_MASK; 
  12.        } 
  13.        boolean changeBounds = (mFlags & PROPERTY_CHANGE_BOUNDS_MASK) == 0; 
  14.        if (changeBounds && a.willChangeBounds()) { 
  15.            mFlags |= PROPERTY_CHANGE_BOUNDS_MASK; 
  16.        } 
  17.        if ((mFlags & PROPERTY_DURATION_MASK) == PROPERTY_DURATION_MASK) { 
  18.            mLastEnd = mStartOffset + mDuration; 
  19.        } else { 
  20.            if (mAnimations.size() == 1) { 
  21.                mDuration = a.getStartOffset() + a.getDuration(); 
  22.                mLastEnd = mStartOffset + mDuration; 
  23.            } else { 
  24.                mLastEnd = Math.max(mLastEnd, a.getStartOffset() + a.getDuration()); 
  25.                mDuration = mLastEnd - mStartOffset; 
  26.            } 
  27.        } 
  28.        mDirty = true; 
  29.    } 

分享这个小例子的初衷,是希望大家对于一个小小的知识点,我们可以跟进看看其中的实现过程,了解过程,麻雀虽小但五脏俱全,希望对你有帮助。

当前题目:Android图片放大缩小动画,竟如此简单
路径分享:http://www.mswzjz.com/qtweb/news4/206704.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联