目标:在使用TranslateAnimation移动的同时,用ScaleAnimation放大图片,在屏幕居中显示. 看TranslateAnimation的构造方法: TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 四个参数分别是,动画开始时x座标偏移量,结束时x座标偏移量,开始时y座标偏移量,结束时y座标偏移量,单位像素,有一点搞不懂的是,为什么是float,像素还有半个? 缩放动画 ScaleAnimation(float fromX, float toX, float fromY, float toY) fromX 宽度起始缩放比例,1为原始大小 toX 宽度最终缩放比例 fromY 高度起始缩放比例,1为原始大小 toY 高度最终缩放比例 在TranslateAnimation里,偏移量还要考虑到scale的影响 下面是主要代码:
//计算activity的size,不包括actionbar
int activityWidth=findViewById(android.R.id.content).getWidth();
int activityHeight=findViewById(android.R.id.content).getHeight();
//获取图片的真实大小
int[] size=ImageUtils.getBitmapSize(this, R.drawable.wallpaper);
int bmpWidth=size[0];
int bmpHeight=size[1];
//计算目标显示尺寸
float displayWidth=0;
float displayHeight=0;
// 如果图片尺寸比activity的尺寸小,直接原大小显示
if (activityWidth > bmpWidth && activityHeight > bmpHeight) {
displayWidth=bmpWidth;
displayHeight=bmpHeight;
}else{
//缩放
// 计算宽高比
float target_ratio = (float) activityWidth / activityHeight;
float real_ratio = bmpWidth / bmpHeight;
if (real_ratio > target_ratio) {
// 如果width太大,height太小,以activityWidth为基准
displayWidth=activityWidth;
displayHeight=((float)activityWidth/bmpWidth)*bmpHeight;
} else {
displayHeight=activityHeight;
displayWidth=((float)activityHeight/bmpHeight)*bmpWidth;
}
}
//缩放比例,等比例放大,toY=toX
float toX=displayWidth/imageView.getWidth();
AnimationSet animationSet = new AnimationSet(true);
animationSet.setDuration(500);
animationSet.setInterpolator(new AccelerateInterpolator());
//计算左上角偏移量,有scale需要乘的1/toX
float toXDelta=((activityWidth-displayWidth)/2.0f-imageView.getX())*(1/toX);
float toYDelta=((activityHeight-displayHeight)/2.0f-imageView.getY())*(1/toX);
//移动
TranslateAnimation translateAnimation=new TranslateAnimation(0, toXDelta, 0, toYDelta);
animationSet.addAnimation(translateAnimation);
ScaleAnimation scaleAnimation=new ScaleAnimation(1.0f, toX, 1.0f, toX);
animationSet.addAnimation(scaleAnimation);
animationSet.setFillAfter(true);
imageView.startAnimation(animationSet);