ดูเหมือนจะไม่มีวิธีง่ายๆในการดำเนินการผ่าน API เนื่องจากภาพเคลื่อนไหวจะเปลี่ยนเมทริกซ์การแสดงผลของมุมมองไม่ใช่ขนาดจริง แต่เราสามารถตั้งค่าขอบลบเพื่อหลอกให้ LinearLayout คิดว่ามุมมองเล็กลง
ดังนั้นฉันขอแนะนำให้สร้างคลาส Animation ของคุณเองโดยใช้ ScaleAnimation และแทนที่เมธอด "applyTransformation" เพื่อกำหนดระยะขอบใหม่และอัปเดตเค้าโครง แบบนี้...
public class Q2634073 extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.q2634073);
findViewById(R.id.item1).setOnClickListener(this);
}
@Override
public void onClick(View view) {
view.startAnimation(new MyScaler(1.0f, 1.0f, 1.0f, 0.0f, 500, view, true));
}
public class MyScaler extends ScaleAnimation {
private View mView;
private LayoutParams mLayoutParams;
private int mMarginBottomFromY, mMarginBottomToY;
private boolean mVanishAfter = false;
public MyScaler(float fromX, float toX, float fromY, float toY, int duration, View view,
boolean vanishAfter) {
super(fromX, toX, fromY, toY);
setDuration(duration);
mView = view;
mVanishAfter = vanishAfter;
mLayoutParams = (LayoutParams) view.getLayoutParams();
int height = mView.getHeight();
mMarginBottomFromY = (int) (height * fromY) + mLayoutParams.bottomMargin - height;
mMarginBottomToY = (int) (0 - ((height * toY) + mLayoutParams.bottomMargin)) - height;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
if (interpolatedTime < 1.0f) {
int newMarginBottom = mMarginBottomFromY
+ (int) ((mMarginBottomToY - mMarginBottomFromY) * interpolatedTime);
mLayoutParams.setMargins(mLayoutParams.leftMargin, mLayoutParams.topMargin,
mLayoutParams.rightMargin, newMarginBottom);
mView.getParent().requestLayout();
} else if (mVanishAfter) {
mView.setVisibility(View.GONE);
}
}
}
}
ข้อแม้ทั่วไปมีผล: เนื่องจากเรากำลังลบล้างวิธีการป้องกัน (ใช้การเปลี่ยนแปลง) จึงไม่รับประกันว่าจะใช้ได้กับ Android เวอร์ชันอนาคต