Android Animation學習 實現 IOS 濾鏡退出動畫

来源:http://www.cnblogs.com/xiaojianli/archive/2016/06/25/5615970.html
-Advertisement-
Play Games

IOS的用戶體驗做的很好,其中一點很重要的地方就是動畫效果。 最近在學習Android的Animation,簡單實現了一個IOS相機濾鏡退出的動畫: 佈局文件:activity_animation_demo.xml 佈局未考慮各個解析度,只是為了實現動畫邏輯,(代碼測試是在720P解析度的手機上) ...


IOS的用戶體驗做的很好,其中一點很重要的地方就是動畫效果。

最近在學習Android的Animation,簡單實現了一個IOS相機濾鏡退出的動畫:

佈局文件:activity_animation_demo.xml  佈局未考慮各個解析度,只是為了實現動畫邏輯,(代碼測試是在720P解析度的手機上)

  1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2     xmlns:tools="http://schemas.android.com/tools"
  3     android:layout_width="match_parent"
  4     android:layout_height="match_parent"
  5     tools:context="com.example.andanimationdemo.AnimationDemoActivity" >
  6     
  7     <FrameLayout
  8         android:layout_width="wrap_content"
  9         android:layout_height="wrap_content"
 10         android:layout_marginTop="50dp"
 11         android:layout_marginLeft="25px"
 12         android:layout_marginRight="25px"
 13         >
 14         <LinearLayout
 15             android:id="@+id/rootLinearLayout" 
 16             android:layout_width="wrap_content"
 17             android:layout_height="wrap_content"
 18             android:orientation="vertical"
 19             >    
 20             <LinearLayout 
 21                 android:id="@+id/firstLinearLayout"
 22                 android:orientation="horizontal"
 23                 android:layout_width="wrap_content"
 24                 android:layout_height="wrap_content">
 25                 <Button
 26                     android:id="@+id/Button_1"
 27                     android:layout_width="200px"
 28                     android:layout_height="200px"
 29                     android:background="@android:color/holo_blue_bright"/>
 30                 <Button
 31                     android:id="@+id/Button_2"
 32                     android:layout_width="200px"
 33                     android:layout_height="200px"
 34                     android:layout_marginLeft="35px"
 35                     android:background="@android:color/holo_green_light"/>
 36                 <Button
 37                     android:layout_marginLeft="35px"
 38                     android:id="@+id/Button_3"
 39                     android:layout_width="200px"
 40                     android:layout_height="200px"
 41                     android:background="@android:color/black"/>
 42             </LinearLayout>
 43             
 44             <LinearLayout 
 45                 android:id="@+id/SencondLinearLayout"
 46                 android:layout_marginTop="35px"
 47                 android:orientation="horizontal"
 48                 android:layout_width="wrap_content"
 49                 android:layout_height="wrap_content">
 50                 <Button
 51                     android:id="@+id/Button_4"
 52                     android:layout_width="200px"
 53                     android:layout_height="200px"
 54                     android:background="@android:color/holo_orange_dark"/>
 55                 <Button
 56                     android:id="@+id/Button_5"
 57                     android:layout_width="200px"
 58                     android:layout_height="200px"
 59                     android:layout_marginLeft="35px"
 60                     android:background="@android:color/holo_red_light"/>
 61                 <Button
 62                     android:layout_marginLeft="35px"
 63                     android:id="@+id/Button_6"
 64                     android:layout_width="200px"
 65                     android:layout_height="200px"
 66                     android:background="@android:color/darker_gray"/>
 67             </LinearLayout>
 68             
 69             <LinearLayout 
 70                 android:id="@+id/ThirdLinearLayout"
 71                 android:layout_marginTop="35px"
 72                 android:orientation="horizontal"
 73                 android:layout_width="wrap_content"
 74                 android:layout_height="wrap_content">
 75                 <Button
 76                     android:id="@+id/Button_7"
 77                     android:layout_width="200px"
 78                     android:layout_height="200px"
 79                     android:background="@android:color/holo_green_light"/>
 80                 <Button
 81                     android:id="@+id/Button_8"
 82                     android:layout_width="200px"
 83                     android:layout_height="200px"
 84                     android:layout_marginLeft="35px"
 85                     android:background="@android:color/holo_orange_light"/>
 86                 <Button
 87                     android:layout_marginLeft="35px"
 88                     android:id="@+id/Button_9"
 89                     android:layout_width="200px"
 90                     android:layout_height="200px"
 91                     android:background="@android:color/holo_blue_light"/>
 92             </LinearLayout>
 93         </LinearLayout>
 94     </FrameLayout>
 95 
 96     <Button
 97         android:id="@+id/Reset"
 98         android:layout_width="wrap_content"
 99         android:layout_height="wrap_content"
100         android:layout_alignParentRight="true"
101         android:layout_alignParentBottom="true"
102         android:layout_marginRight="40dp"
103         android:layout_marginBottom="40dp"
104         android:text="Reset"></Button>
105 
106 </RelativeLayout>
View Code

 AnimationDemoActivity.java

  1 package com.example.andanimationdemo;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.util.Log;
  6 import android.view.View;
  7 import android.view.View.OnClickListener;
  8 import android.view.animation.Animation;
  9 import android.view.animation.Animation.AnimationListener;
 10 import android.view.animation.ScaleAnimation;
 11 import android.widget.Button;
 12 import android.widget.LinearLayout;
 13 
 14 public class AnimationDemoActivity extends Activity implements OnClickListener{
 15 
 16     private static final String TAG = "AnimationDemo";
 17     LinearLayout rootLinearLayout;
 18     Button resetButton;
 19     int mCurrentClickButtonId = -1;
 20     
 21     int[] ButtonID = new int[] {
 22         R.id.Button_1,R.id.Button_2,R.id.Button_3,
 23         R.id.Button_4,R.id.Button_5,R.id.Button_6,
 24         R.id.Button_7,R.id.Button_8,R.id.Button_9
 25     };
 26     
 27     @Override
 28     protected void onCreate(Bundle savedInstanceState) {
 29         super.onCreate(savedInstanceState);
 30         setContentView(R.layout.activity_animation_demo);
 31         rootLinearLayout = (LinearLayout) findViewById(R.id.rootLinearLayout);
 32         resetButton = (Button) findViewById(R.id.Reset);
 33         setButtonListener();
 34     }
 35     
 36     private void setButtonListener() {
 37         for (int i = 0; i < ButtonID.length; i++) {
 38             rootLinearLayout.findViewById(ButtonID[i]).setOnClickListener(this);
 39         }
 40         resetButton.setOnClickListener(this);
 41     }
 42 
 43     /**
 44      * 點擊某個按鈕後,開始放大動畫
 45      * 這裡提供的是一個思路,並不局限於當前佈局,放大倍數,通過哪個點放大,都可以計算出來。
 46      */    
 47     boolean onAnimationRunning = false;
 48     
 49     public void onAnimationButtonClick() {
 50         Log.d(TAG, "onAnimationButtonClick");
 51         int[] position = new int[2];
 52         int[] ButtonPosition = new int[2];
 53         Button AnimaitonBtton = (Button) rootLinearLayout.findViewById(ButtonID[mCurrentClickButtonId - 1]);
 54         rootLinearLayout.getLocationInWindow(position);
 55         AnimaitonBtton.getLocationInWindow(ButtonPosition);
 56         int rootWidth = rootLinearLayout.getWidth();
 57         int rootHeight = rootLinearLayout.getHeight();
 58         int ButtonWidth = AnimaitonBtton.getWidth();
 59         int ButtonHeight = AnimaitonBtton.getHeight();
 60         
 61         /**
 62          * 計算 scale factor
 63          */
 64         float widthRate = (float)rootWidth/ButtonWidth;
 65         float heightRate = (float)rootHeight/ButtonHeight;
 66         
 67         /**
 68          * 計算放大的中心點
 69          */
 70         float PointA = (ButtonPosition[0] - position[0]) * widthRate / (widthRate - 1);
 71         float PointB = (ButtonPosition[1] - position[1]) * heightRate / (heightRate - 1);
 72         
 73         onAnimationRunning = true;
 74         ScaleAnimation mScaleAnimation = new ScaleAnimation(1.0f, widthRate, 1.0f, heightRate,PointA,PointB);
 75         mScaleAnimation.setDuration(2000);
 76         mScaleAnimation.setFillAfter(true);
 77         mScaleAnimation.setAnimationListener(new AnimationListener() {
 78             
 79             @Override
 80             public void onAnimationStart(Animation animation) {
 81             }
 82             
 83             @Override
 84             public void onAnimationRepeat(Animation animation) {
 85             }
 86             
 87             @Override
 88             public void onAnimationEnd(Animation animation) {
 89                 Log.d(TAG,"onAnimationEnd");
 90                 onAnimationRunning = false;
 91                 for (int i = 0; i< ButtonID.length; i++) {
 92                     rootLinearLayout.findViewById(ButtonID[i]).setEnabled(false);
 93                 }
 94             }
 95         });
 96         rootLinearLayout.startAnimation(mScaleAnimation);
 97         
 98     }
 99     
100     @Override
101     public void onClick(View v) {
102         // TODO Auto-generated method stub
103         Log.d(TAG, "onClick :" + v.getId());
104         if (onAnimationRunning) {
105             Log.d(TAG, "onAnimationRunning = true");
106             return;
107         }
108         
109         switch (v.getId()) {
110         case R.id.Button_1:
111             mCurrentClickButtonId = 1;
112             onAnimationButtonClick();
113             break;
114         case R.id.Button_2:
115             mCurrentClickButtonId = 2;
116             onAnimationButtonClick();
117             break;
118         case R.id.Button_3:
119             mCurrentClickButtonId = 3;
120             onAnimationButtonClick();
121             break;
122         case R.id.Button_4:
123             mCurrentClickButtonId = 4;
124             onAnimationButtonClick();
125             break;
126         case R.id.Button_5:
127             mCurrentClickButtonId = 5;
128             onAnimationButtonClick();
129             break;
130         case R.id.Button_6:
131             mCurrentClickButtonId = 6;
132             onAnimationButtonClick();
133             break;
134         case R.id.Button_7:
135             mCurrentClickButtonId = 7;
136             onAnimationButtonClick();
137             break;
138         case R.id.Button_8:
139             mCurrentClickButtonId = 8;
140             onAnimationButtonClick();
141             break;
142         case R.id.Button_9:
143             mCurrentClickButtonId = 9;
144             onAnimationButtonClick();
145             break;
146         case R.id.Reset:
147             mCurrentClickButtonId = -1;
148             rootLinearLayout.clearAnimation();
149             rootLinearLayout.postInvalidate();
150             for (int i = 0; i< ButtonID.length; i++) {
151                 rootLinearLayout.findViewById(ButtonID[i]).setEnabled(true);
152             }
153             break;
154         default:
155             break;
156         }
157     }
158 }
View Code

 點擊某個Button後,可以通過它所在的位置坐標,以及父佈局所在的位置坐標,計算出通過哪個點放大。

 實現的效果如下圖:

 

如有什麼不對的地方,還望大神指正。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 一.什麼是Service Service是一個應用程式組件,它是安卓實現程式後臺運行的一個解決方案。 二.分類 服務有兩種類別started、bound.但是一個服務類所要繼承的類是一樣的,都是Service類。也就是說,一個服務,可以包含上面兩種運行方式的服務,只是與它重載的方法有關,如果重寫了o ...
  • 我以自己項目中的一個模塊為例,首先有兩個頁面,第一個頁面為顯示城市頁面,第二個頁面為選擇要使用block傳的值(城市名)。 第一個頁面中的顯示控制項: //自定義左部定位視圖 self.locView = [[LocationView alloc] initWithFrame:CGRectMake(0 ...
  • 滾動視圖:在根視圖中添加UIScrollViewDelegate協議,聲明一些對象屬性 在程式中導入圖片,在.m文件中的代碼實現: 推薦:http://www.cnblogs.com/roucheng/p/3528371.html ...
  • 1.手機助手 1.1 USB鏈接 可以讀取手機的PID和VID,確定唯一的設備,可以給手機安裝對應的驅動等 socket在固定埠通信 1.2 WIFI鏈接 pc在電腦在整個網段發送UDP數據包,手機連接wifi後可以監聽這個埠,收到數據包,試圖與pc機建立連接 1.3 藍牙 通過Bluetoot ...
  • 首先介紹一下BroadCastRecieve有幾種: 1.無序廣播(普通廣播):sendBroadcast()方式 2.有序廣播:sendOrderedBroadcast()方式 3.粘性廣播:sendStickyBroadcast()方式 生命周期比較簡單: 下麵是無序廣播與有序廣播的區別: 下麵 ...
  • 工具:顯示快捷鍵幫助:Ctrl+Shift+LQuick access:Ctrl+3自定義ShortKeys:Window > preference > 搜索框中輸入“keys” 或者 Ctrl+3 輸入“keys” 尤其是Quick access(Ctrl+3)這個工具非常實用,可以找到任何一個菜 ...
  • 1.實現方式 1.1使用HttpUrlConnection 1.2使用HttpClient 1.3使用Socket,比如:豌豆莢,聊天工具 2.通訊渠道 2.1 WLAN(wi-fi),100米左右的數據傳輸 2.2 手機APN接入點(基站) 2.2.1 wap的方式,中國特色,首先會連接電信運營商 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...