【转】2D动画:view的Matrix

转载地址:http://blog.csdn.net/flowingflying

上学习的小例子是从左上角进行扩展动画,如果我们需要在中心进行扩展,相关的代码如下:

public class ViewAnimation1 extends Animation{
    private float centerX,centerY; 
    
    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) { 
        super.initialize(width, height, parentWidth, parentHeight); 
        centerX =  width/2.0f;
        centerY = height/2.0f;
        setDuration(2500);
        setFillAfter(true);
        setInterpolator(new LinearInterpolator());        
    }
   
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
        final Matrix matrix = t.getMatrix();
        Log.v("WEI","orignal matrix  " + matrix);
        matrix.setScale(interpolatedTime, interpolatedTime); 
        matrix.preTranslate(-lastPointX, -lastPointX); 
        matrix.postTranslate(centerX, centerY);

        Log.v("WEI"," target matrix  " + matrix); 
    }
}

矩阵

这里动画代码较之一开始的小例子有些令人困惑,需要先弄明白Matrix。从Android的reference和例子的LogCat跟踪,我们知道Matrix是一个3×3的矩阵,具体为:

而通过getMatrix()获得的是View没有发生动画变化的矩阵,即单位矩阵:

赋值操作

setScale()、setXXX()表示直接设置矩阵。执行matrix.setScale(interpolatedTime,interpolatedTime)后就获得下左图的view,我们需要进一步将移动位置,移动到下右图。

setXXX()相当于赋值操作。赋值的操作有以下:

matrix.reset() :设置为单位矩阵
matrix.setScale() :如上左图,以(0,0)为支点进行缩放
matrix.setTranslate()
matrix.setRotate()
matrix.setSkew()

乘操作:前乘和后乘

如果我们在setScale()后,进行
setTranslate()操作,等于进行了两次赋值,最终值是后面的赋值,也就是前面setScale()无效。我们将看到的是整个view的移动,
没有缩放效果。为此需要使用preXXX()和postXXX()的操作。在数学上是矩阵的计算,pre表示在作为前面的参数乘以一个矩阵,即
M’=M*other,M为前乘;post表示作为后面参数乘一个矩阵M’=other*M,M为后乘,而set表示设置矩阵M=other。在图像处理
上,pre表示先进行某个图像处理,接着是set的图像处理,最后是post的图像处理。

要实现目标效果,我们也可以通过下面的方法:

final Matrix matrix = t.getMatrix();
matrix.setScale(interpolatedTime, interpolatedTime);
matrix.postTranslate(centerX*(1-interpolatedTime), centerY*(1-interpolatedTime));

在图像处理上,先进行缩放,如左图,然后平移到右图位置。在数学上,也很容易证明

如果通过下面的方式:

final Matrix matrix = t.getMatrix();
matrix.setScale(interpolatedTime, interpolatedTime);
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);

在图像上,先将图像移动(-centerX,-centerY),相当将中心点方在(0,0)的位置上,然后缩放,最后将中心点移动到(centerX,centerY),如图所示:

在数学上也和容易证明:

或者

Matrix运算真是神奇,事实上,layout动画也是通过Matrix类来实现的。

矩阵计算

Matrix类还提供了直接矩阵计算方式。Matrix a=new Matrix()相当于创建一个单位矩阵。

a.set(b),就是赋值a = b;

a.preConCat(b),相当于前乘,即 a=a×b;

a.postConCat(b),相当于前乘,即 a=b×a;

c.setConcat(a,b),相当于c=a×b;

对于例子,我们可以设置3个矩阵,分别表示3种图形效果;

Matrix m1 = new Matrix();
m1.setScale(interpolatedTime, interpolatedTime);

Matrix m2 = new Matrix();
m2.setTranslate(-centerX, -centerY);

Matrix m3 = new Matrix();
m3.setTranslate(centerX, centerY);

要实现同样的例子效果,可以:

//matrix = m1
matrix.preConcat(m2);   //matrix = matrix * m2 = m1 * m2;
matrix.postConcat(m3); //matrix = m3 * matrix = m 3 * (m1* m2) = m3 * m1 *m2;

或者

// matrix = m1 * m2;
matrix.setConcat(m3, matrix); //matrix = m3 * matrix = m3* (m1* m2) = m3 * m1 * m2;

【转】2D动画:view的Matrix

时间: 2024-08-25 19:06:58

【转】2D动画:view的Matrix的相关文章

Unity3D初学之2D动画制

作者:Alex Rose Unity最近宣布推出额外的2D游戏支持,添加了Box 2D物理和一个精灵管理器. 但这里还是有些技巧需要牢记在心.逐帧更改图像只是动画制作的冰山一角,若要让你的游戏出色运行,你还得使用转换和旋转等功能. 现在让我们先从基本技巧开始. 更改帧 如果你已经准备好了制作动画的纹理,你可能会使用SpriteManager脚本的付费版本,或者Unity的新版本.假设你使用的是2D位面和纹理.这就是一个低效率的方法,但如果你是在制作一个game jam的项目,你可能会想塞入一些可

android 动画 ——视图动画(View Animation)

android动画分为视图动画(View Animation).属性动画(Property Animation) 想看属性动画(Property Animation):请移步至http://blog.csdn.net/u013424496/article/details/51700312 这里我们来说下视图动画(View Animation)的纯代码写法,还有一种是xml调用, 对于xml调用可以去看 http://blog.csdn.net/u013424496/article/details

2D动画的制作

通过css3的transform  transition可以实现平移,旋转,缩放,拉伸等效果 1.缩放 -webkit-transform: scale(1); -moz-transform: scale(1); -ms-transform: scale(1); -o-transform: scale(1); transform: scale(1); 2.平移 -webkit-transform: translate(0px, 0px); -moz-transform: translate(0p

css 2D动画

2D动画: 通过 CSS3  transform转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 2D移动:translate().使用translate()函数,你可以把元素从原来的位置移动.移动参照元素左上角原点 a)     语法:translate(tx)  | translate(tx,ty) b)     tx是一个代表X轴(横坐标)移动的向量长度,当其值为正值时,元素向X轴右方向移动,反之其值为负值时,元素向X轴左方向移动. c)      ty是一个代表Y轴(纵向标)移动的

安卓自定义View进阶-Matrix原理

Matrix原理 作者微博: @GcsSloop [本系列相关文章] 前言 本文内容偏向理论,和 画布操作 有重叠的部分,本文会让你更加深入的了解其中的原理. 本篇的主角Matrix,是一个一直在后台默默工作的劳动模范,虽然我们所有看到View背后都有着Matrix的功劳,但我们却很少见到它,本篇我们就看看它是何方神圣吧. 由于Google已经对这一部分已经做了很好的封装,所以跳过本部分对实际开发影响并不会太大,不想深究的粗略浏览即可,下一篇中将会详细讲解Matrix的具体用法和技巧. Matr

安卓自定义View进阶-Matrix详解

这应该是目前最详细的一篇讲解Matrix的中文文章了,在上一篇文章Matrix原理中,我们对Matrix做了一个简单的了解,偏向理论,在本文中则会详细的讲解Matrix的具体用法,以及与Matrix相关的一些实用技巧. Matrix方法表 按照惯例,先放方法表做概览. 方法类别 相关API 摘要 基本方法 equals hashCode toString toShortString 比较. 获取哈希值. 转换为字符串 数值操作 set reset setValues getValues 设置.

关于动画的几种状态表示的含义以及能够使用2d动画表述为什么要使用3d动画表述

transform 四种转换 translate 位置scale 缩放rotate 旋转skew 倾斜 以上四种转换方式是比较特殊的,其实他们都是由matrix 矩阵转换来: animation的五种状态 动画速度这些曲线称之为贝塞尔曲线CSS88 这是一个css有关的网站:ease 由快到慢 最后非常慢linear 匀速ease-in 速度越来快 加速状态ease-out 速度越来越慢ease-in-out 速度先快后慢以上五种动画速度是比较特殊都是由贝塞尔曲线得来的 3D 转换 transl

使用uGUI制作游戏内2D动画

在3D的游戏中制作2D的效果是一个很常见的需求,我在很早前玩过一个叫做艾尔之光的游戏,里面就大量的使用了这个技术.就像下面图片中的伤害数字,这些数字往往还是有一些动画效果在里面的,比如大小的变化,颜色的变化等.在使用NGUI的时候这个东西做起来有点麻烦,因为2D对象在屏幕的位置需要根据游戏内3D对象的位置进行换算.但是在uGUI中,这个问题有了一个非常好的解决方案. 我先把做好的效果图放上来,原谅我不会做gif,其实图中的圆环是个2D的帧动画.它会跟着cube的移动而运动. 对于如何使用图片制作

随着ScrollView的滑动,渐渐的执行动画View

今天是实现了一个小功能的东西.看看效果图: 实现方式: 1.自定义ScrollView   复写onScrollChange方法,来计算滑动的位置. 2.自定义接口,通过接口来在ScrollView中控制,滑动的高度的进度. 3.在自定义View中去执行动画. 代码实现: 1.ScrollView   最主要的代码只有计算滑动位置的代码了,其实也是很简单的,获取子View的个数,每次都去for循环,去计算字View的位置,以及当前ScrollView的top bottom 代码: @Overri