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

移动开发 Android
Android图片放大缩小动画,竟如此简单。分享这个小例子的初衷,是希望大家对于一个小小的知识点,我们可以跟进看看其中的实现过程,了解过程,麻雀虽小但五脏俱全,希望对你有帮助。

[[190226]]

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

我们借助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. <?xml version="1.0" encoding="utf-8"?> 
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:fillAfter="false"
  4.     <scale 
  5.         android:duration="300" 
  6.         android:fromXScale="1" 
  7.         android:fromYScale="1" 
  8.         android:pivotX="50%" 
  9.         android:pivotY="50%" 
  10.         android:toXScale="2" 
  11.         android:toYScale="2" /> 
  12.     <scale 
  13.         android:duration="300" 
  14.         android:fromXScale="1" 
  15.         android:fromYScale="1" 
  16.         android:pivotX="50%" 
  17.         android:pivotY="50%" 
  18.         android:startOffset="300" 
  19.         android:toXScale="0.5" 
  20.         android:toYScale="0.5" /> 
  21. </set
  1. <ImageView 
  2.       android:id="@+id/iv_good" 
  3.       android:layout_width="wrap_content" 
  4.       android:layout_height="wrap_content" 
  5.       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.    } 

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

【本文为51CTO专栏作者“洪生鹏”的原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2018-04-11 10:07:09

大数据

2021-02-19 11:55:36

C语言MD5加密

2013-05-14 11:13:02

AIR Android放大缩小手势

2019-10-11 09:39:44

HTTP调用系统

2011-05-30 13:23:11

Android 动画

2017-12-15 16:03:28

2019-07-31 14:34:00

数据库MySQLJava

2015-07-06 10:52:19

BAT数据中心

2017-12-25 09:30:00

互联网视频流量耗费成本

2021-07-05 06:51:41

Nacos微服务源码

2019-10-15 09:46:46

机器学习人工智能计算机

2021-04-23 16:40:49

Three.js前端代码

2011-08-19 17:02:46

iPhone开发

2015-12-07 10:00:13

HTML5Loading动画

2020-02-20 16:07:45

IT需求

2017-09-12 17:05:02

AndroidLoading客户端

2016-12-26 18:16:41

戴尔成就篇

2011-01-06 09:38:10

2020-12-28 07:47:35

动态代理AOP

2022-02-23 20:42:40

HTMLmarkdownturndown
点赞
收藏

51CTO技术栈公众号