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. <?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

时间: 2024-10-03 09:16:37

Android图片放大缩小动画,竟如此简单的相关文章

android 图片放大缩小 多点缩放

http://blog.csdn.net/fan476767883/article/details/7283438 在这我把点击按钮缩放的代码贴上来,因为实在讨厌网上普遍流传的那种"替换imageiew的方法". 主要代码如下 [java] view plaincopyprint? import android.app.Activity;   import android.graphics.Matrix;   import android.graphics.PointF;   impo

Android中imageView图片放大缩小及旋转功能示例代码

一.简介 二.方法 1)设置图片放大缩小效果 第一步:将<ImageView>标签中的android:scaleType设置为"fitCenter" android:scaleType="fitCenter" 第二步:获取屏幕的宽度 DisplayMetrics dm=new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); dm.widthPixels 第三

Android自定义ImageView实现自动放大缩小动画

这篇讲的是如何生成一个自定义的ImageView,实现自动放大缩小动画. 为什么实现这个功能呢?因为我想在ViewPager实现图片放大缩小的动画,但是ViewPager几个页面的动画会一起动,而且放大全屏图片的话会相互覆盖,很诡异.于是上网搜demo,一无所获.迫于无奈... 废话不多说,直接贴代码. 1.配置文件直接添加 当直接在布局文件中添加图片的话,可以在自定义View代码中用getDrawable()获取图片资源,然后通过DrawBitmap绘制图片.通过不断绘制图片的位置,达到放大缩

js实现图片放大缩小功能后进行复杂排序的方法_jquery

这是一个基于jquery的图片效果,它的作用是:当图片点击变大(变小)时,其它图片按照一定的规则进行排序运动. 首先来看下最终的效果图: 有人可能看到这个会觉得,这有什么难的,这么简单的事,楼主是不是太小提大作了?当你真正去尝试时,你才知道到底有什么难点.  首先,我们来讲下需求: 1.图片分为大小和小图,大图占四个小图的位置, 2.点击图片放大缩小, 重新排列顺序, 3. 当点击偶数列(2,4)时,它前面的那项将向提出来向后面排列 4.第一个项不能动,点第二个是将占第三四的位置,从后面取第一个

viewpager-在ViewPager中的图片放大缩小事件与viewPager的滑动事件冲突了

问题描述 在ViewPager中的图片放大缩小事件与viewPager的滑动事件冲突了 我现在的状况是我在代码中写了一个图片的放大缩小,但是现在的情况是,在ViewPager中的图片要放大都放大,要是缩小都缩小,请问这个事情怎么解决呢?求助大神呢

Android多点触控实现对图片放大缩小平移,惯性滑动等功能_Android

文章将在原有基础之上做了一些扩展功能: 1.图片的惯性滑动 2.图片缩放小于正常比例时,松手会自动回弹成正常比例 3.图片缩放大于最大比例时,松手会自动回弹成最大比例 实现图片的缩放,平移,双击缩放等基本功能的代码如下,每一行代码我都做了详细的注释 public class ZoomImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View.OnTouchListener , V

JS简单的图片放大缩小的两种方法_javascript技巧

以左上角为定点,放大缩小,该点位置不变. 方法一: Html代码 复制代码 代码如下:    <script type="text/javascript">         //兼容IE和火狐   缩小放大.缩放         function ImageSuofang(args) {             var oImg = document.getElementById("oImg");             if (args) {     

关于pictureBox里面图片放大缩小的问题

问题描述 ///<summary>///拖动///</summary>PointM_pot_p=newPoint();//原始位置intM_int_mx=0,M_int_my=0;//下次能继续intM_int_maxX,M_int_maxY;//加快读取用privatevoidpictureBox_MouseDown(objectsender,MouseEventArgse){if(pictureBox1.Image!=null){M_pot_p=e.Location;M_int

android 双击图片放大缩小

package com.szxys.doubleclike; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawa