IOS的用户体验做的很好,其中一点很重要的地方就是动画效果。

最近在学习Android的Animation,简单实现了一个IOS相机滤镜退出的动画:

布局文件:activity_animation_demo.xml  布局未考虑各个分辨率,只是为了实现动画逻辑,(代码测试是在720P分辨率的手机上)

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.andanimationdemo.AnimationDemoActivity" > <FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:layout_marginLeft="25px"
android:layout_marginRight="25px"
>
<LinearLayout
android:id="@+id/rootLinearLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/firstLinearLayout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/Button_1"
android:layout_width="200px"
android:layout_height="200px"
android:background="@android:color/holo_blue_bright"/>
<Button
android:id="@+id/Button_2"
android:layout_width="200px"
android:layout_height="200px"
android:layout_marginLeft="35px"
android:background="@android:color/holo_green_light"/>
<Button
android:layout_marginLeft="35px"
android:id="@+id/Button_3"
android:layout_width="200px"
android:layout_height="200px"
android:background="@android:color/black"/>
</LinearLayout> <LinearLayout
android:id="@+id/SencondLinearLayout"
android:layout_marginTop="35px"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/Button_4"
android:layout_width="200px"
android:layout_height="200px"
android:background="@android:color/holo_orange_dark"/>
<Button
android:id="@+id/Button_5"
android:layout_width="200px"
android:layout_height="200px"
android:layout_marginLeft="35px"
android:background="@android:color/holo_red_light"/>
<Button
android:layout_marginLeft="35px"
android:id="@+id/Button_6"
android:layout_width="200px"
android:layout_height="200px"
android:background="@android:color/darker_gray"/>
</LinearLayout> <LinearLayout
android:id="@+id/ThirdLinearLayout"
android:layout_marginTop="35px"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/Button_7"
android:layout_width="200px"
android:layout_height="200px"
android:background="@android:color/holo_green_light"/>
<Button
android:id="@+id/Button_8"
android:layout_width="200px"
android:layout_height="200px"
android:layout_marginLeft="35px"
android:background="@android:color/holo_orange_light"/>
<Button
android:layout_marginLeft="35px"
android:id="@+id/Button_9"
android:layout_width="200px"
android:layout_height="200px"
android:background="@android:color/holo_blue_light"/>
</LinearLayout>
</LinearLayout>
</FrameLayout> <Button
android:id="@+id/Reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="40dp"
android:layout_marginBottom="40dp"
android:text="Reset"></Button> </RelativeLayout>

AnimationDemoActivity.java

 package com.example.andanimationdemo;

 import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.ScaleAnimation;
import android.widget.Button;
import android.widget.LinearLayout; public class AnimationDemoActivity extends Activity implements OnClickListener{ private static final String TAG = "AnimationDemo";
LinearLayout rootLinearLayout;
Button resetButton;
int mCurrentClickButtonId = -1; int[] ButtonID = new int[] {
R.id.Button_1,R.id.Button_2,R.id.Button_3,
R.id.Button_4,R.id.Button_5,R.id.Button_6,
R.id.Button_7,R.id.Button_8,R.id.Button_9
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation_demo);
rootLinearLayout = (LinearLayout) findViewById(R.id.rootLinearLayout);
resetButton = (Button) findViewById(R.id.Reset);
setButtonListener();
} private void setButtonListener() {
for (int i = 0; i < ButtonID.length; i++) {
rootLinearLayout.findViewById(ButtonID[i]).setOnClickListener(this);
}
resetButton.setOnClickListener(this);
} /**
* 点击某个按钮后,开始放大动画
* 这里提供的是一个思路,并不局限于当前布局,放大倍数,通过哪个点放大,都可以计算出来。
*/
boolean onAnimationRunning = false; public void onAnimationButtonClick() {
Log.d(TAG, "onAnimationButtonClick");
int[] position = new int[2];
int[] ButtonPosition = new int[2];
Button AnimaitonBtton = (Button) rootLinearLayout.findViewById(ButtonID[mCurrentClickButtonId - 1]);
rootLinearLayout.getLocationInWindow(position);
AnimaitonBtton.getLocationInWindow(ButtonPosition);
int rootWidth = rootLinearLayout.getWidth();
int rootHeight = rootLinearLayout.getHeight();
int ButtonWidth = AnimaitonBtton.getWidth();
int ButtonHeight = AnimaitonBtton.getHeight(); /**
* 计算 scale factor
*/
float widthRate = (float)rootWidth/ButtonWidth;
float heightRate = (float)rootHeight/ButtonHeight; /**
* 计算放大的中心点
*/
float PointA = (ButtonPosition[0] - position[0]) * widthRate / (widthRate - 1);
float PointB = (ButtonPosition[1] - position[1]) * heightRate / (heightRate - 1); onAnimationRunning = true;
ScaleAnimation mScaleAnimation = new ScaleAnimation(1.0f, widthRate, 1.0f, heightRate,PointA,PointB);
mScaleAnimation.setDuration(2000);
mScaleAnimation.setFillAfter(true);
mScaleAnimation.setAnimationListener(new AnimationListener() { @Override
public void onAnimationStart(Animation animation) {
} @Override
public void onAnimationRepeat(Animation animation) {
} @Override
public void onAnimationEnd(Animation animation) {
Log.d(TAG,"onAnimationEnd");
onAnimationRunning = false;
for (int i = 0; i< ButtonID.length; i++) {
rootLinearLayout.findViewById(ButtonID[i]).setEnabled(false);
}
}
});
rootLinearLayout.startAnimation(mScaleAnimation); } @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d(TAG, "onClick :" + v.getId());
if (onAnimationRunning) {
Log.d(TAG, "onAnimationRunning = true");
return;
} switch (v.getId()) {
case R.id.Button_1:
mCurrentClickButtonId = 1;
onAnimationButtonClick();
break;
case R.id.Button_2:
mCurrentClickButtonId = 2;
onAnimationButtonClick();
break;
case R.id.Button_3:
mCurrentClickButtonId = 3;
onAnimationButtonClick();
break;
case R.id.Button_4:
mCurrentClickButtonId = 4;
onAnimationButtonClick();
break;
case R.id.Button_5:
mCurrentClickButtonId = 5;
onAnimationButtonClick();
break;
case R.id.Button_6:
mCurrentClickButtonId = 6;
onAnimationButtonClick();
break;
case R.id.Button_7:
mCurrentClickButtonId = 7;
onAnimationButtonClick();
break;
case R.id.Button_8:
mCurrentClickButtonId = 8;
onAnimationButtonClick();
break;
case R.id.Button_9:
mCurrentClickButtonId = 9;
onAnimationButtonClick();
break;
case R.id.Reset:
mCurrentClickButtonId = -1;
rootLinearLayout.clearAnimation();
rootLinearLayout.postInvalidate();
for (int i = 0; i< ButtonID.length; i++) {
rootLinearLayout.findViewById(ButtonID[i]).setEnabled(true);
}
break;
default:
break;
}
}
}

点击某个Button后,可以通过它所在的位置坐标,以及父布局所在的位置坐标,计算出通过哪个点放大。

实现的效果如下图:

如有什么不对的地方,还望大神指正。

Android Animation学习 实现 IOS 滤镜退出动画的更多相关文章

  1. Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition

    Android Animation学习(五) ApiDemos解析:容器布局动画 LayoutTransition Property animation系统还提供了对ViewGroup中的View改变 ...

  2. Android Animation学习(四) ApiDemos解析:多属性动画

    Android Animation学习(四) ApiDemos解析:多属性动画 如果想同时改变多个属性,根据前面所学的,比较显而易见的一种思路是构造多个对象Animator , ( Animator可 ...

  3. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

  4. Android Animation学习(六) View Animation介绍

    Android Animation学习(六) View Animation介绍 View Animation View animation系统可以用来执行View上的Tween animation和F ...

  5. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  6. Android Animation学习(一) Property Animation原理介绍和API简介

    Android Animation学习(一) Property Animation介绍 Android Animation Android framework提供了两种动画系统: property a ...

  7. Android Animation学习(二) ApiDemos解析:基本Animatiors使用

    Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.ObjectAnimator.AnimatorSet ApiDemos中Animation部分是单独 ...

  8. Android Animation学习笔记

    原文地址: http://www.cnblogs.com/feisky/archive/2010/01/11/1644482.html 关于动画的实现,Android提供了Animation,在And ...

  9. Android animation学习笔记之view/drawable animation

    前一章中总结了android animation中property animation的知识和用法,这一章总结View animation和Drawable animation的有关知识: View ...

随机推荐

  1. prototype.js 源码解读(02)

    如果你想研究一些比较大型的js框架的源码的话,本人建议你从其最初的版本开始研读,因为最初的版本东西少,易于研究,而后的版本基本都是在其基础上不断扩充罢了,所以,接下来我不准备完全解读prototype ...

  2. 如何为企业选择最理想的Linux服务器系统?

    [2013年10月12日 51CTO外电头条]什么样的Linux服务器最合适您的企业?简言之,它需要为员工带来工作所需的理想支持效果. 相对于成百上千种Linux桌面系统,Linux服务器系统的数量其 ...

  3. ZooKeeper系列之八:ZooKeeper的简单操作

    http://blog.csdn.net/shenlan211314/article/details/6187035 1 )使用 ls 命令来查看当前 ZooKeeper 中所包含的内容: [zk: ...

  4. iOS-NSString-Base64String-Base64原理

    之前看到好多人找Str2Base64Str,还有好多自己写了方法的,仔细研究了下base64的编码原理(这个我写在下面),发现官方的API已经可以完成这项功能,这里贴出来供大家参考. 一言不合就上代码 ...

  5. h.264 scanning process for transform coefficients

    宏块在经过变换.量化后,得到大小为4x4或者8x8的矩阵,矩阵中的数据被称为transform coefficient levels.这些level在后面会被用于熵编码,因此我们需要把矩阵按照一定顺序 ...

  6. 关于__irq 的使用

    __irq为一个标识,用来表示一个函数是否为中断函数. 对于不同的编译器,__irq在函数名中的位置不一样,例如: ADS编译器中 : void __irq IRQ_Eint0(void); Keil ...

  7. Android开源项目发现---Spinner选择器与日历选择器篇(持续更新)

    1. android-times-square Android日历部件 支持选取单个日期,多个日期,及日期区间段和对话框形式显示 项目地址:https://github.com/square/andr ...

  8. 【HDOJ】3367 Pseudoforest

    并查集. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 10005 #d ...

  9. Matlab与CCS的连接

    1.CCS概述 Matlab 6.5(R13)或以上集成了CCSLink工具,可以支持CCS能够识别的任何板卡及其硬件DSP. 验证CCSLink是否在主机上安装成功,Matlab输入命令:help ...

  10. 用Delphi制作仿每行带按钮的列表

    Delphi做程序开发在使用到列表控件时,一般是列表放文本内容,在列表以外放操作按钮,选中列表某项再点按钮进行操作.现在Web开发做列表的样式总是列表的每行都有操作按钮,如微博的列表风格: Web开发 ...