`
iaiai
  • 浏览: 2197011 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android 两种按钮的动画效果

 
阅读更多
先来看效果:



上面为两个按钮,点击对应的按钮,绿色背景会滚动到相应的按钮后面
点击红色方块会有反转效果,仿照win8磁铁的效果

下面是代码
ScrollAnimation.java
package com.iaiai.activity;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.Transformation;

/**
 * 
 * <br/>
 * Title: ScrollAnimation.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-2-19 上午10:53:06<br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class ScrollAnimation extends Animation {

	private View view;
	private Camera camera = new Camera();
	private boolean direction = true; // true往右,false往左

	public ScrollAnimation(View view, boolean direction) {
		this.view = view;
		this.direction = direction;
	}

	@Override
	public void initialize(int width, int height, int parentWidth, int parentHeight) {
		super.initialize(width, height, parentWidth, parentHeight);
		setDuration(300);
		setFillAfter(true);
		setFillBefore(true);
		setInterpolator(new LinearInterpolator());
	}

	protected void applyTransformation(float interpolatedTime, Transformation transformation) {
		Matrix matrix = transformation.getMatrix();

		camera.save();
		if (direction) {
			camera.translate(interpolatedTime * view.getWidth(), 0.0f, 0);
		} else {
			camera.translate(view.getWidth() - (interpolatedTime * view.getWidth()), 0.0f, 0);
		}
		camera.getMatrix(matrix);
		camera.restore();
	}
}


RotateAnimation.java
package com.iaiai.activity;

import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;

/**
 * 
 * <br/>
 * Title: RotateAnimation.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-2-19 上午10:07:57<br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class RotateAnimation extends Animation {

	/** 值为true时可明确查看动画的旋转方向。 */
	public static final boolean DEBUG = false;
	/** 沿Y轴正方向看,数值减1时动画逆时针旋转。 */
	public static final boolean ROTATE_DECREASE = true;
	/** 沿Y轴正方向看,数值减1时动画顺时针旋转。 */
	public static final boolean ROTATE_INCREASE = false;
	/** Z轴上最大深度。 */
	public static final float DEPTH_Z = 310.0f;
	/** 动画显示时长。 */
	public static final long DURATION = 800l;
	/** 图片翻转类型。 */
	private final boolean type;
	private final float centerX;
	private final float centerY;
	private Camera camera;
	/** 用于监听动画进度。当值过半时需更新txtNumber的内容。 */
	private InterpolatedTimeListener listener;

	public RotateAnimation(View view, boolean type) {
		centerX = view.getWidth() / 2.0f;
		centerY = view.getHeight() / 2.0f;
		this.type = type;
		setDuration(DURATION);
	}

	public void initialize(int width, int height, int parentWidth, int parentHeight) {
		// 在构造函数之后、getTransformation()之前调用本方法。
		super.initialize(width, height, parentWidth, parentHeight);
		camera = new Camera();
	}

	public void setInterpolatedTimeListener(InterpolatedTimeListener listener) {
		this.listener = listener;
	}

	protected void applyTransformation(float interpolatedTime, Transformation transformation) {
		// interpolatedTime:动画进度值,范围为[0.0f,10.f]
		if (listener != null) {
			listener.interpolatedTime(interpolatedTime);
		}
		float from = 0.0f, to = 0.0f;
		if (type == ROTATE_DECREASE) {
			from = 0.0f;
			to = 180.0f;
		} else if (type == ROTATE_INCREASE) {
			from = 360.0f;
			to = 180.0f;
		}
		float degree = from + (to - from) * interpolatedTime;
		boolean overHalf = (interpolatedTime > 0.5f);
		if (overHalf) {
			// 翻转过半的情况下,为保证数字仍为可读的文字而非镜面效果的文字,需翻转180度。
			degree = degree - 180;
		}
		// float depth = 0.0f;
		float depth = (0.5f - Math.abs(interpolatedTime - 0.5f)) * DEPTH_Z;
		final Matrix matrix = transformation.getMatrix();
		camera.save();
		camera.translate(0.0f, 0.0f, depth);
		camera.rotateY(degree);
		camera.getMatrix(matrix);
		camera.restore();
		if (DEBUG) {
			if (overHalf) {
				matrix.preTranslate(-centerX * 2, -centerY);
				matrix.postTranslate(centerX * 2, centerY);
			}
		} else {
			// 确保图片的翻转过程一直处于组件的中心点位置
			matrix.preTranslate(-centerX, -centerY);
			matrix.postTranslate(centerX, centerY);
		}
	}

	/** 动画进度监听器。 */
	public static interface InterpolatedTimeListener {
		public void interpolatedTime(float interpolatedTime);
	}

}


MainActivity.java
package com.iaiai.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AnimationUtils;
import android.widget.TextView;

import com.iaiai.activity.RotateAnimation.InterpolatedTimeListener;

public class MainActivity extends Activity implements OnClickListener, InterpolatedTimeListener {

	private boolean bol = true;
	private boolean enableRefresh;
	private int number = 0;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (!bol)
					findViewById(R.id.tv).startAnimation(new ScrollAnimation(findViewById(R.id.tv), false));
				bol = true;
			}
		});
		findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (bol)
					findViewById(R.id.tv).startAnimation(new ScrollAnimation(findViewById(R.id.tv), true));
				bol = false;
			}
		});

		findViewById(R.id.layout1).setOnClickListener(this);
	}

	public void onClick(View v) {
		enableRefresh = true;
		RotateAnimation rotateAnim = null;
		if (bol) {
			number--;
			rotateAnim = new RotateAnimation(findViewById(R.id.layout1), RotateAnimation.ROTATE_DECREASE);
		} else {
			number++;
			rotateAnim = new RotateAnimation(findViewById(R.id.layout1), RotateAnimation.ROTATE_INCREASE);
		}
		if (rotateAnim != null) {
			rotateAnim.setInterpolatedTimeListener(this);
			rotateAnim.setFillAfter(true);
			findViewById(R.id.layout1).startAnimation(rotateAnim);
		}
	}

	@Override
	public void interpolatedTime(float interpolatedTime) {
		// 监听到翻转进度过半时,更新txtNumber显示内容。
		if (enableRefresh && interpolatedTime > 0.5f) {
			((TextView) findViewById(R.id.ltv)).setText(Integer.toString(number));
			enableRefresh = false;
		}
	}

}


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/white"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="10dip"
        android:paddingLeft="20dip"
        android:paddingRight="20dip"
        android:paddingTop="10dip" >

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:id="@+id/tv"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_weight="1"
                    android:background="#00ff00" />

                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_weight="1"
                    android:textColor="@android:color/black"
                    android:textSize="20dip"
                    android:visibility="invisible" />
            </LinearLayout>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal" >

                <TextView
                    android:id="@+id/btn1"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:text="左旋转"
                    android:textColor="@android:color/black"
                    android:textSize="20dip" />

                <TextView
                    android:id="@+id/btn2"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_weight="1"
                    android:gravity="center"
                    android:text="右旋转"
                    android:textColor="@android:color/black"
                    android:textSize="20dip" />
            </LinearLayout>
        </RelativeLayout>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout1"
        android:layout_width="150dip"
        android:layout_height="150dip"
        android:background="#ff0000" >

        <TextView
            android:id="@+id/ltv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="文字"
            android:textColor="@android:color/white"
            android:textSize="20dip" />
    </LinearLayout>

</LinearLayout>


  • 大小: 7.2 KB
  • 大小: 7.4 KB
  • ta.rar (13.1 KB)
  • 下载次数: 17
分享到:
评论

相关推荐

    android 按钮动画效果

    在Android开发中,按钮动画效果是提升用户界面交互体验的重要手段。在Android 2.3及更高版本中,我们可以利用Eclipse IDE来实现各种丰富的按钮动画。本文将深入探讨如何在Android项目中创建和实现这些动画效果。 ...

    android实现图片闪烁动画效果的两种实现方式(实用性高)

    其实实现这种动画效果有很多种方法,最常见的是两种:第一种就是插入n张图片进行切换已达到如此目的,第二种就是通过改变一张图片的透明度来达到闪烁的效果。下面就分别讲一下通过这两种方法如何实现。 第一种:...

    Android开发之利用动画做出悬浮效果(新版)

    Android提供了两种类型的动画:补间动画(Tween Animation)和帧动画(Frame Animation)。补间动画用于改变对象的视觉属性,如位置、大小、透明度等,而帧动画则用于播放一系列图像,类似于电影胶片。在这个悬浮...

    android两种页面切换动画效果源码

    本资源提供了两种不同的页面切换动画效果的官方源码,开发者可以直接引入到自己的项目中,无需从头编写,大大节省了开发时间和提高了效率。 1. 页面切换动画基础 在Android中,我们可以使用`Activity`之间的`Intent...

    Android 抖动动画效果

    首先,我们要知道在Android中,动画主要分为两种类型:补间动画(Tween Animation)和帧动画(Frame Animation)。抖动动画属于补间动画的一种,因为它涉及到对象的位置、大小或透明度等属性的变化。补间动画是通过...

    Android动画效果大全

    首先,Android提供两种主要的动画机制:帧动画(Frame Animation)和属性动画(Property Animation)。帧动画适用于一系列静态图像的连续播放,常用于创建简单的动画如图标旋转或滑动效果。属性动画系统则更为强大,...

    安卓动画效果相关-AnimCheckBox按钮点击动画效果.rar

    在Android开发中,动画效果是提升用户体验的重要手段之一。这个资源包"安卓动画效果相关-AnimCheckBox按钮点击动画效果.rar"包含了一个特定的动画实现,即AnimCheckBox,它是在用户点击CheckBox时展示的一种视觉反馈...

    Android 动画效果集合

    Android系统提供了两种主要的动画机制:属性动画(Property Animation)和视图动画(View Animation)。属性动画是在Android 3.0(API级别11)引入的,它允许对对象的任意属性进行动画处理,而不仅仅是视图的位置和...

    Android学习之Android 5.0分享动画实现微信点击全屏效果

    - **Transition**: 定义了两个场景(Scene)之间的动画效果。 - **TransitionSet**: 允许组合多个Transition,实现更复杂的动画序列。 - **ChangeTransform**: 用于处理视图的缩放和旋转。 - **ChangeBounds**: ...

    android按钮点击动画特效,有关注按钮点击效果,有收藏按钮,点赞按钮,评论按钮等各种效果

    4. **第三方库**:有些开源库如`shapeshifter`、`button-animation`等,已经封装了丰富的按钮动画效果,可以直接集成到项目中使用。 在资源包中的"LikeButton"可能是一个示例代码或库,它专门针对点赞按钮的点击...

    Android动画效果的强悍框架

    Android支持两种主要的动画机制:补间动画(Tween Animation)和帧动画(Frame Animation)。补间动画用于改变视图的位置、大小、透明度等属性,它通过在一段时间内平滑地改变这些属性来创建动画效果。帧动画则类似...

    Android 光影效果的文字动画特效.rar

    在Android开发中,创建引人入胜的用户体验是至关重要的,而动画效果是提升应用吸引力的一种有效手段。"Android 光影效果的文字动画特效"是一个专门为Android平台设计的动画库,它能让文字或按钮产生类似光线划过的...

    Android 积分签到动画 位移+透明 Android签到动画效果 签到上移消失动画效果

    1. **动画框架**:Android提供了两种主要的动画框架——`Animation`类和`Property Animation`系统。这里涉及的位移和透明度动画更适合使用`Property Animation`,因为它更加灵活且性能优化。 2. **ObjectAnimator**...

    android Activity间切换动画效果演示源码

    本资源提供的"android Activity间切换动画效果演示源码"涵盖了模糊、水波纹以及折叠等多种动态效果,旨在帮助开发者了解并实现各种复杂的Activity切换动画。 1. **Activity切换动画基础** Android中的Activity切换...

    安卓动画效果相关-Android仿窗帘效果和登录界面拖动效果Scroller类的应用.rar

    在Android开发中,动画效果是提升用户体验的关键因素之一。本资料包主要探讨的是如何实现“窗帘效果”和“登录界面拖动效果”,这两个都是通过利用`Scroller`类来完成的。`Scroller`类是Android系统提供的一个帮助类...

    Android抖动动画效果(上下抖和以角旋转)

    "Android抖动动画效果(上下抖和以角旋转)"这个主题主要关注如何实现物体在屏幕上进行上下抖动和以角度旋转这两种动态效果。抖动动画通常用于错误提示、输入验证等场景,而角旋转则常见于按钮点击、加载图标等交互...

    Android-一个用于Android的轻量级粒子动画库

    在Android中,动画分为两种主要类型:属性动画(Property Animation)和视图动画(View Animation)。粒子动画库可能是基于属性动画系统构建的,因为属性动画提供了更强大的功能,可以改变对象的任意属性,并且支持...

    安卓 收藏和取消收藏的点击小动画

    Android提供了两种主要的动画类型:帧动画(Frame Animation)和属性动画(Property Animation)。帧动画是基于一系列静态图像播放的动画,而属性动画则可以改变对象的属性并随着时间推移更新视图。 对于收藏和取消...

Global site tag (gtag.js) - Google Analytics