Android动画缩放图像以适应屏幕宽度和高度
我在屏幕的不同位置放置了四个图像。现在我想动画缩放他们点击,以适应屏幕的宽度和高度。点击后,我想淡出屏幕上的其他内容。目前我正在使用以下代码来缩放它们Android动画缩放图像以适应屏幕宽度和高度,android,animation,Android,Animation,我在屏幕的不同位置放置了四个图像。现在我想动画缩放他们点击,以适应屏幕的宽度和高度。点击后,我想淡出屏幕上的其他内容。目前我正在使用以下代码来缩放它们 Animation logoMoveAnimation = AnimationUtils.loadAnimation(this, R.anim.zoom_image); view.startAnimation(logoMoveAnimation); 其中,zoom_image.xml是 <?xml version="1.0" encodi
Animation logoMoveAnimation = AnimationUtils.loadAnimation(this, R.anim.zoom_image);
view.startAnimation(logoMoveAnimation);
其中,zoom_image.xml是
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator">
<scale android:fromXScale="0.0" android:fromYScale="0.0"
android:toXScale="1.0" android:toYScale="1.0"
android:duration="700" android:fillBefore="false" />
<translate android:fromXDelta="0.0" android:fromYDelta="1.0"
android:duration="700" />
</set>
上面的代码不起作用,因为我知道xml不正确,我需要在编码中做一些额外的工作。试试-
ImageView view = <from xml>;
view.startAnimation(logoMoveAnimation);
ImageView=;
view.startAnimation(logoMoveAnimation);
并在ImageView的XML属性中设置scaletype=fitxy。试试-
ImageView view = <from xml>;
view.startAnimation(logoMoveAnimation);
ImageView=;
view.startAnimation(logoMoveAnimation);
并在ImageView的XML属性中设置scaletype=fitxy
final int initialWidth = v.getWidth();
final int initialHeight = v.getHeight();
Log.v("WIDTH_", Integer.toString(initialWidth));
Log.v("HEIGHT_", Integer.toString(initialHeight));
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
final int finalHeight = displaymetrics.heightPixels;
final int finalWidth = displaymetrics.widthPixels;
Log.v("WIDTH_F", Integer.toString(finalWidth));
Log.v("HEIGHT_F", Integer.toString(finalHeight));
final int animationDuration = 1500;
final float stepX = (float)((float)(finalWidth - initialWidth))/animationDuration;
final float stepY = (float)((float)(finalHeight - initialHeight))/animationDuration;
Log.v("stepX", Float.toString(stepX));
Log.v("stepY", Float.toString(stepY));
final RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
int newWidth, newHeight;
Log.v("INTERPOLATION_T", Float.toString(interpolatedTime));
newWidth = (int)Math.ceil((initialWidth + stepX*interpolatedTime*animationDuration));
newHeight = (int)Math.ceil((initialHeight + stepY*interpolatedTime*animationDuration));
if(v.getTag().toString().equals("1")) {
//layoutParams.setMargins(0, (int)-interpolatedTime*initialHeight, 0, 0);
}
else if(v.getTag().toString().equals("2")) {
layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.separator1);
//layoutParams.setMargins((int)-interpolatedTime*initialWidth, (int)-interpolatedTime*initialHeight, 0, 0);
}
else if(v.getTag().toString().equals("3")) {
layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.separator2);
//layoutParams.setMargins((int)-interpolatedTime*initialWidth, (int)-interpolatedTime*initialHeight, 0, 0);
}
else if(v.getTag().toString().equals("4")) {
layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.separator3);
//layoutParams.setMargins((int)-interpolatedTime*initialWidth, (int)-interpolatedTime*initialHeight, 0, 0);
}
v.setLayoutParams(layoutParams);
v.getLayoutParams().height = newHeight;
v.getLayoutParams().width = newWidth;
v.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
a.setInterpolator(new LinearInterpolator());
a.setDuration(animationDuration);
a.setFillAfter(true);
v.startAnimation(a);
我最终使用了以下代码
final int initialWidth = v.getWidth();
final int initialHeight = v.getHeight();
Log.v("WIDTH_", Integer.toString(initialWidth));
Log.v("HEIGHT_", Integer.toString(initialHeight));
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
final int finalHeight = displaymetrics.heightPixels;
final int finalWidth = displaymetrics.widthPixels;
Log.v("WIDTH_F", Integer.toString(finalWidth));
Log.v("HEIGHT_F", Integer.toString(finalHeight));
final int animationDuration = 1500;
final float stepX = (float)((float)(finalWidth - initialWidth))/animationDuration;
final float stepY = (float)((float)(finalHeight - initialHeight))/animationDuration;
Log.v("stepX", Float.toString(stepX));
Log.v("stepY", Float.toString(stepY));
final RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
int newWidth, newHeight;
Log.v("INTERPOLATION_T", Float.toString(interpolatedTime));
newWidth = (int)Math.ceil((initialWidth + stepX*interpolatedTime*animationDuration));
newHeight = (int)Math.ceil((initialHeight + stepY*interpolatedTime*animationDuration));
if(v.getTag().toString().equals("1")) {
//layoutParams.setMargins(0, (int)-interpolatedTime*initialHeight, 0, 0);
}
else if(v.getTag().toString().equals("2")) {
layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.separator1);
//layoutParams.setMargins((int)-interpolatedTime*initialWidth, (int)-interpolatedTime*initialHeight, 0, 0);
}
else if(v.getTag().toString().equals("3")) {
layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.separator2);
//layoutParams.setMargins((int)-interpolatedTime*initialWidth, (int)-interpolatedTime*initialHeight, 0, 0);
}
else if(v.getTag().toString().equals("4")) {
layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.separator3);
//layoutParams.setMargins((int)-interpolatedTime*initialWidth, (int)-interpolatedTime*initialHeight, 0, 0);
}
v.setLayoutParams(layoutParams);
v.getLayoutParams().height = newHeight;
v.getLayoutParams().width = newWidth;
v.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
a.setInterpolator(new LinearInterpolator());
a.setDuration(animationDuration);
a.setFillAfter(true);
v.startAnimation(a);
我试着用这段代码,动画不流畅。你能找到任何工作吗?我试着用这个代码,动画是不平滑的。你能在附近找到工作吗?