先抄一部分
一个控件在其父窗口中的坐标位置
View.getLocationInWindow(int[] location)
一个控件在其整个屏幕上的坐标位置
View.getLocationOnScreen(int[] location)
代码差不多就这样
int[] location = new int[2];
textView.getLocationInWindow(location);
Log.d("main", " location[0] ="+location[0] +" location[1] "+ location[1]);
注意:这个获取到的坐标位置都是正数,原点都是左上角,对于控件C而言,那获取到的分别就是C的左上角到B的左上角&C的左上角到A的左上角xy轴的绝对值
开始动画
1、缩放动画ScaleAnimation(float fromX, float toX, float fromY, float toY)
像下面这个,就是把自己从原始大小放大到两倍大
AnimationSet animationSet = new AnimationSet(true);
ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f);
animationSet.addAnimation(scaleAnimation);
animationSet.setDuration(500);//持续时间
animationSet.setFillAfter(true);
animationSet.setInterpolator(new AccelerateInterpolator());
myView.startAnimation(animationSet);
如果第1,3两个值是0f的话,那就是从无到有的放大了
注意:这个放大和缩小,目标的左上角坐标都是不变的,就是向下拉伸的感觉
2、平移动画
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
float fromXDelta:这个参数表示动画开始的点离当前View X坐标上的差值;
float toXDelta, 这个参数表示动画结束的点离当前View X坐标上的差值;
float fromYDelta, 这个参数表示动画开始的点离当前View Y坐标上的差值;
float toYDelta)这个参数表示动画开始的点离当前View Y坐标上的差值;
如果view在A(x,y)点 那么动画就是从B点(x+fromXDelta, y+fromYDelta)点移动到C 点(x+toXDelta,y+toYDelta)点.
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
type:对应值的参照(Animation.ABSOLUTE, Animation.RELATIVE_TO_SELF,or Animation.RELATIVE_TO_PARENT)
Animation.ABSOLUTE,那么对应的值应该是具体的坐标值,比如100到300,指绝对的屏幕像素单位
Animation.RELATIVE_TO_SELF或者 Animation.RELATIVE_TO_PARENT指的是相对于自身或父控件,对应值应该理解为相对于自身或者父控件的几倍或百分之多少。
用法和上面那个没有type的差不多。Attention:这些坐标都是指的目标的左上角的坐标。xyz轴的的方向,y是向下的,这个需要知道一下
3、旋转动画 Rotated3dAnimation
这个动画也有好几种方法,主要来看一下下面这个
Rotate3dAnimation(float fromDegrees, float toDegrees, int centerXType, float centerX, int centerYType, float centerY, float depthZ, boolean reverse)
fromDegrees 和toDegrees 顾名思义,就是把当前的控件从某一个角度转到另一个角度,想怎么转怎么转。
后面的就是控件所在的位置到要旋转轴的距离了,type和值和上面的平移动画一样。当然如果你旋转最后调用的
camera.rotateY(),那么,不管怎么设置centerY的值,都不管用,camera.rotateX()和camera.rotateZ()同理
2018/11/19
今天遇到一个处理动画的时候 setFillAfter(true)不管用,一次位移动画之后下一次动画并不是从我上一次结束动画的地方开始,而是从空间本来的位置开始动画。最后发现原因如下:
animation只是操作View 的位图表示(bitmap representation),而不是真正的改变View的位置
动画结束后,View回到了原来的位置,setFillAfter 和 setFillBefore 并不能解决这个问题,要使View保持动画结束时的状态,必须另外改变View的属性(动画并不会帮助你改变View的属性),setFillAfter 和 setFillBefore 只能改变动画的属性
为什么会有setFillAfter 和 setFillBefore这两个方法:
是因为有动画链的原因,假定你有一个移动的动画紧跟一个淡出的动画,如果你不把移动的动画的setFillAfter置为true,那么移动动画结束后,View会回到原来的位置淡出,如果setFillAfter置为true, 就会在移动动画结束的位置淡出
如有不对,欢迎指正