成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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加密

2019-10-11 09:39:44

HTTP調用系統

2013-05-14 11:13:02

AIR Android放大縮小手勢

2017-12-15 16:03:28

2011-05-30 13:23:11

Android 動畫

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微服務源碼

2021-04-23 16:40:49

Three.js前端代碼

2019-10-15 09:46:46

機器學習人工智能計算機

2020-02-20 16:07:45

IT需求

2015-12-07 10:00:13

HTML5Loading動畫

2017-09-12 17:05:02

AndroidLoading客戶端

2011-08-19 17:02:46

iPhone開發

2011-01-06 09:38:10

2016-12-26 18:16:41

戴爾成就篇

2025-03-04 00:02:00

Python序列報錯

2020-12-28 07:47:35

動態代理AOP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩av在线不卡 | 中文字幕亚洲精品 | 亚洲色欲色欲www | a级免费黄色片 | 国产精品电影在线观看 | 91天堂网 | 91av导航 | 一级黄色录像片子 | 欧美精品一区二区三区在线播放 | 欧美不卡 | 黄色网址免费在线观看 | 国内久久精品 | 亚洲精品乱码久久久久久久久久 | 亚洲第一成人影院 | 久久久精品综合 | 精品久久久久久久久久久久久久 | 国产精品久久久久久久久久久久久 | 一区精品国产欧美在线 | 2018天天干天天操 | 欧美日韩国产一区 | 久久久国产视频 | 中文字幕一区二区三区精彩视频 | 99精品久久久久久中文字幕 | 亚洲国产精品视频一区 | 中文字幕日韩专区 | 成人网视频| 在线观看亚洲精品 | 国产精品免费一区二区三区四区 | 国产精品久久久久久久久久免费看 | 大乳boobs巨大吃奶挤奶 | 一区二区免费 | 中文字幕视频在线 | 亚洲国产精品99久久久久久久久 | 亚洲aⅴ | 成人av网站在线观看 | 国产精品天堂 | 国产精品视频在线免费观看 | 欧美日韩成人网 | 国产一区二区在线视频 | www.久| 99影视|