初学Android,图形图像之自定义补间动画(三十八)

news/2024/7/8 5:09:35 标签: android, 图形, transformation, listview, animation, matrix

Android提供Animation作为补间动画抽象基类,而且为该抽象基类提供了

AlphaAnimation,RotateAnimation,ScaleAnimation,TranslateAnimation四个类

但是在实际项目中,这些很可能不够用,可能需要一些更复杂的动画,比如说立体空间的旋转动画

基于特殊的要求,我们就需要继承Animation,重写applyTransformation(float interpolatedTime,Transformation)方法

interpolatedTime:代表了动画的时间进行比

Tansformation:该参数代表了初间动画在不同时刻对图形或组件的变形程度,其中封装了一个Matrix对象

为了控制图片或View进行三维的变换,还需要借助Android提供的Camera.手机的三维坐标系统有x,y,z三个轴

Camera对象提供了rotateX(float deg),rotateY(float deg),rotateZ(float deg)来沿着三个轴旋转

下面是一个例子,applyTransformation方法是重点



选定义一个自定义的动画类

package WangLi.Graphics.ListViewTween;

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

public class MyAnimation extends Animation
{
	private int centerX;
	private int centerY;
	//定义动画的持续事件
	private int duration;
	private Camera camera = new Camera();
	public MyAnimation(int centerX, int centerY , int duration)
	{
		this.centerX = centerX;
		this.centerY = centerY;
		this.duration = duration;
	}
	@Override
	public void initialize(int width, int height, int parentWidth,
		int parentHeight)
	{
		super.initialize(width, height, parentWidth, parentHeight);
		//设置动画的持续时间
		setDuration(duration);
		//设置动画结束后效果保留
		setFillAfter(true);
		setInterpolator(new LinearInterpolator());
	}
	/*
	 * 该方法的interpolatedTime代表了抽象的动画持续时间,不管动画实际持续时间多长,
	 * interpolatedTime参数总是从0(动画开始时)~1(动画结束时)
	 * Transformation参数代表了对目标组件所做的变.
	 */
	@Override
	protected void applyTransformation(float interpolatedTime, Transformation t)
	{
		camera.save();
		//根据interpolatedTime时间来控制X、Y、Z上的偏移
		camera.translate(100.0f - 100.0f * interpolatedTime ,
			150.0f * interpolatedTime - 150 ,
			80.0f - 80.0f * interpolatedTime);
		// 设置根据interpolatedTime时间在Y柚上旋转不同角度。
		camera.rotateY(360 * (interpolatedTime));
		// 设置根据interpolatedTime时间在X柚上旋转不同角度
		camera.rotateX((360 * interpolatedTime));
		//获取Transformation参数的Matrix对象
		Matrix matrix = t.getMatrix();
		camera.getMatrix(matrix);
		matrix.preTranslate(-centerX, -centerY);
		matrix.postTranslate(centerX, centerY);
		camera.restore();
	}
}
主界面

package WangLi.Graphics.ListViewTween;

import android.app.Activity;
import android.os.Bundle;
import android.view.Display;
import android.view.WindowManager;
import android.widget.ListView;

public class ListViewTween extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//获取ListView组件
		ListView list = (ListView)findViewById(R.id.list);
		WindowManager windowManager = (WindowManager)
			getSystemService(WINDOW_SERVICE);
		Display display = windowManager.getDefaultDisplay();
		//获取屏幕的宽和高
		int screenWidth = display.getWidth();
		int screenHeight = display.getHeight();
		//设置对ListView组件应用动画
		list.setAnimation(new MyAnimation(screenWidth / 2
			, screenHeight / 2  , 3500));
	}
}




http://www.niftyadmin.cn/n/1411356.html

相关文章

CentOS6.6系统安装

一步步教你安装CentOS 6.6系统说明:截止目前CentOS 6.x最新版本为CentOS 6.6,下面介绍CentOS 6.6的具体安装配置过程服务器相关设置如下:操作系统:CentOS 6.6 64位IP地址:192.168.21.129网关:192.168.21.2D…

react-router-dom示例讲解(七),路径递归

在react-router-dom的官方示例中,路径递归不是最难的,但是绝对是一个比较难理解的示例demo。 本示例的效果图如下: 相关示例核心代码: import React, {Component} from react; import {BrowserRouter as Router,Route,Link,S…

初学Android,图形图像之使用SurfaceView(三十九)

SurfaceView支持双缓冲,在实现游戏绘图上面比View更出色 它有几个重要方法 Canvas lockCanvas(): 锁定整个SurfaceView对象,获取该Surface上的Canvas Canvas lockCanvas(Rect dirty): 锁定SurfaceView上Rect划分的区域,获取该Surface上的Canvas unlock…

面向万物互联的时序数据库HiTSDB

现在填写调查问卷,将优先获得公测资格 当前物联网的浪潮席卷全球,甚至于人们还没有真正意识到物联网的存在,但它已经无处不在 。个人智能手环,家庭里使用的智能空调,空气净化器,电饭煲,到社会化…

初学Android,图形图像之使用SurfaceView(四十)

SurfaceView跟View最大的不同就是,它可以局部更新Canvas,而不用像View一样,重绘整个画面 并且View的绘图必须在当前的UI线程中进行,当需要花较长时间更新绘图时,主UI线程就会阻塞,无法响应用户操作,而Surfa…

react-router-dom示例讲解(8)侧边栏

在react-router-dom的官方示例中,侧边栏是非常容易实现的一个示例,奇实现的核心就是展示两组Routes。 本示例的效果图如下: 相关的核心代码: import React, {Component} from react; import {BrowserRouter as Router,Route,…

BootStrap 概念

网格系统中的缩写; xs extra small sm smal md middle/medium lg large

初学Android,数据存储之SharedPreferences(四十一)

有时候,应用程序有少量数据需要保存,比如说是否使用振动,是否打开GPS等设置,对于这些小数据量的需求,没有必要使用数据库 Android提供了SharedPreferences接口,它用来读取程序的Preferences数据&#xff0c…