내가 이렇게되면 애니메이션을 할 노력하고있어 :안드로이드 - 레이아웃의 TranslateAnimation 업데이트 동적으로 크기
컨텍스트 :
내가해야 할 두 EditText
년대가있을 때 당신을 그 하나를 클릭하면 다른 하나가 첫 번째 것 뒤에서 나옵니다. 여기 내가 원하는 사진을 찍을 사진이 있습니다.
분명 내가 처음 뒤에서 두 번째 EditText
를 이동하기 위해 TranslateAnimation
을 필요로이 작업을 수행합니다.
내 방식 :
나는를 사용하여 A FrameLayout
에 줄 알았는데 다른 이상 EditText
에 1 점을 추가하는 듯 한 다음 첫 번째의 onTouch 이벤트에서 두 번째에 TranslateAnimation
을 할 수있는 첫 번째 일은. 이 문제는 wrap_content
에 FrameLayout
키가있는 경우 애니메이션이 사용자에게 보이지 않는다는 것입니다. 내가 생각
두 번째 솔루션은 TranslateAnimation
한 AnimationListener
를 추가했다 :이 그림에서 볼 수 있듯이 내가 런타임에 FrameLayout
의 높이를 변경하면 나는 처음 EditText
아래의 빈 공간을 남겨 둘 것이다 FrameLayout
의 높이를 변경하려면 onAnimationStart
방법을 사용합니다. 그러나 이것의 문제점은 FrameLayout
의 높이가 너무 갑자기 변경된다는 것입니다. 애니메이션을 부드럽게 유지하고 싶습니다.
내 질문 : 나는 아래로 두 번째 EditText
이동으로 FrameLayout
의 높이를 변경, 첫 번째 뒤에서 두 번째 EditText
의 부드러운 애니메이션을 얻을 수있는 방법
?
감사합니다.
업데이트 :
는 내가 검색이 경우에 차이가있어없는 RelativeLayout
하여 FrameLayout
을 변경했습니다. 애니메이션을 원활하게 표시하기 위해 EditText
과 AnimationScale
을 모두 포함하는이 RelativeLayout
을 시도했지만 작동하지 않았습니다. 여기 내 코드는 다음과 같습니다.
protected void expanse() {
Log.d("Accordion", "expandAccordion");
//Translate the top of the second EditText to its bottom
TranslateAnimation translateSecond = new TranslateAnimation(second.getLeft(), second.getLeft(),
second.getTop(), second.getBottom());
translateSecond.setDuration(1000);
//Scale the relative layout to show the both of them
ScaleAnimation scaleContainer = new ScaleAnimation(container.getLeft(), container.getLeft(),
container.getTop(), second.getBottom());
scaleContainer.setDuration(1000);
//At the end of the scaling, change the height of the relative layout
scaleContainer.setAnimationListener(new AnimationListenerAdapter() {
@Override
public void onAnimationEnd(Animation animation) {
RelativeLayout.LayoutParams params = (LayoutParams) container.getLayoutParams();
params.height = second.getBottom();
container.setLayoutParams(params);
super.onAnimationEnd(animation);
}
});
container.startAnimation(scaleContainer);
second.startAnimation(translateSecond);
}
350W 350dp와 같은 큰 높이를 하드 코딩하면 애니메이션이 올바르게 표시됩니다.
UPDATE : I는 모두 이동 시도
, 제 EditText
아래 레이아웃. 이것은 코드입니다. BTW 사용자가 ViewPager
으로 ListView
을 변경 한 다른 이유로이 변경 사항은 없습니다.
public class MainActivity extends FragmentActivity {
private EditText first;
private EditText second;
private HoboViewPager pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pager = (HoboViewPager) findViewById(R.id.pager);
pager.setPageTransformer(true, new RotationPageTransformer());
pager.setAdapter(new SampleAdapter(this, getSupportFragmentManager()));
first = (EditText) findViewById(R.id.location_search_field);
second = (EditText) findViewById(R.id.term_search_field);
first.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
expanseSecondField();
return true;
}
});
}
protected void expanseSecondField() {
TranslateAnimation translateSecondField = new TranslateAnimation(second.getLeft(), second.getLeft(),
second.getTop(), second.getBottom());
translateSecondField.setFillAfter(true);
translateSecondField.setDuration(1000);
TranslateAnimation translateContainer = new TranslateAnimation(pager.getLeft(), pager.getLeft(),
pager.getTop(), pager.getTop() + second.getBottom());
translateContainer.setFillAfter(true);
translateContainer.setDuration(1000);
pager.startAnimation(translateContainer);
second.startAnimation(translateSecondField);
}
}
컨테이너의 TranslateAnimation이 즉시 실행되기 때문에 작동하지 않았습니다. 결과는 애니메이션의 끝에서 컨테이너의 크기를 변경하려고 할 때와 동일합니다.
좋은 생각입니다. 나는 그것을 시도해 볼 것이고, 만약에 효과가 있다면 당신의 대답을 받아 들일 것입니다. 감사! – 4gus71n
이 솔루션은'FrameLayout'에서 애니메이션을 수행 할 때 뷰가 무효화되고'EditText'의 애니메이션을 볼 수 없기 때문에 작동하지 않습니다. 내 업데이트를 확인하십시오. – 4gus71n
두 개의 별도 TranslateAnimation 인스턴스를 만들어야합니다. –