728x90
반응형
질문 : Android : 애니메이션 확장 / 축소
다음과 같은 수직 linearLayout이 있다고 가정 해 보겠습니다.
[v1]
[v2]
기본적으로 v1에는 visibily = GONE이 있습니다. 확장 애니메이션과 함께 v1을 표시하고 동시에 v2를 누르고 싶습니다.
나는 다음과 같이 시도했다.
Animation a = new Animation()
{
int initialHeight;
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final int newHeight = (int)(initialHeight * interpolatedTime);
v.getLayoutParams().height = newHeight;
v.requestLayout();
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
initialHeight = height;
}
@Override
public boolean willChangeBounds() {
return true;
}
};
하지만이 솔루션을 사용하면 애니메이션이 시작될 때 깜박입니다. 애니메이션이 적용되기 전에 v1이 전체 크기로 표시했기 때문이라고 생각합니다.
자바 스크립트를 사용하면 jQuery의 한 줄입니다! Android로이 작업을 수행하는 간단한 방법이 있습니까?
답변
이 질문이 인기를 얻었으므로 실제 솔루션을 게시합니다. 가장 큰 장점은 애니메이션을 적용하기 위해 확장 된 높이를 알 필요가 없으며 뷰가 확장되면 콘텐츠가 변경되면 높이가 조정된다는 것입니다. 그것은 나를 위해 잘 작동합니다.
public static void expand(final View v) {
int matchParentMeasureSpec = View.MeasureSpec.makeMeasureSpec(((View) v.getParent()).getWidth(), View.MeasureSpec.EXACTLY);
int wrapContentMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
v.measure(matchParentMeasureSpec, wrapContentMeasureSpec);
final int targetHeight = v.getMeasuredHeight();
// Older versions of android (pre API 21) cancel animations for views with a height of 0.
v.getLayoutParams().height = 1;
v.setVisibility(View.VISIBLE);
Animation a = new Animation()
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
v.getLayoutParams().height = interpolatedTime == 1
? LayoutParams.WRAP_CONTENT
: (int)(targetHeight * interpolatedTime);
v.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
// Expansion speed of 1dp/ms
a.setDuration((int)(targetHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}
public static void collapse(final View v) {
final int initialHeight = v.getMeasuredHeight();
Animation a = new Animation()
{
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
if(interpolatedTime == 1){
v.setVisibility(View.GONE);
}else{
v.getLayoutParams().height = initialHeight - (int)(initialHeight * interpolatedTime);
v.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
// Collapse speed of 1dp/ms
a.setDuration((int)(initialHeight / v.getContext().getResources().getDisplayMetrics().density));
v.startAnimation(a);
}
@Jefferson이 주석에서 언급했듯이 애니메이션의 지속 시간 (및 속도)을 변경하여 더 부드러운 애니메이션을 얻을 수 있습니다. 현재 1dp / ms의 속도로 설정되어 있습니다.
출처 : https://stackoverflow.com/questions/4946295/android-expand-collapse-animation
728x90
반응형
'프로그래밍 언어 > Android' 카테고리의 다른 글
Android Studio의 전체 프로젝트에서 모든 문자열 검색 (0) | 2021.06.17 |
---|---|
Android 오류 : 기기에 * .apk를 설치하지 못했습니다. * : 시간 초과 (0) | 2021.06.15 |
프로그래밍 방식으로 Android 휴대 전화의 전화 번호 가져 오기 (0) | 2021.06.14 |
Android의 EditText보기에서 여러 줄을 허용하는 방법 (0) | 2021.06.14 |
Android ListView를 새로 고치는 방법 (0) | 2021.06.14 |