Clickable ImageView Местоположение изменения с анимацией - Android
-
25-09-2019 - |
Вопрос
У меня есть ImageView, который включен в RelativeLayout. Когда нажатие ImageView, я анимирую всю релактивелютью с помощью перевода анимации, чтобы переместить его.
Когда я снова нажимаю изображение ImageView (в новом месте), он должен перемещать его резервным копирование, но это не так. Однако, если я нажму, где запущен ImageView, он перемещает всю «панель». Почему imageView не двигается с релактивелем ... по крайней мере, поскольку на кликадиве. Фактическое изображение движется, но место, где это кликабельно нет.
Вот мой XML для макета:
<RelativeLayout
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_width="fill_parent"
android:layout_height="120px"
android:layout_marginTop="-106px"
android:id="@+id/chatbox"
android:visibility="invisible">
<TextView
android:layout_width="fill_parent"
android:layout_height="106px"
android:background="#000000"
android:id="@+id/chattext" />
<ImageView
android:layout_width="20px"
android:layout_height="14px"
android:id="@+id/chatbubble"
android:layout_below="@id/chattext"
android:src="@drawable/chatbubble" />
</RelativeLayout>
Редактировать: Я должен добавить, что я использую Animation.setfillafter (true), чтобы держать панель на месте после завершения анимации.
Решение
Это потому, что анимации фактически не влияют на позиции по видам, они просто нарисуют их. Итак, чтобы обрабатывать щелчок на новом месте, вы должны сделать что-то там (т.е. невидимое framelayout). Или вы можете изменить свои взгляды на полях в анимации, поэтому взгляды на самом деле будут переходить на место.
Другие советы
У меня была такая же проблема, и лучшее решение, которое я нашел, - это добавить анимациюListener в вашу анимацию и переместить вид на этот слушатель, как сказал Константин Бурув:
animation.setFillAfter(false);
AnimationListener animListener = new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
RelativeLayout.LayoutParams relativeLayoutParams = (LayoutParams) yourView.getLayoutParams();
//To avoid the flicker
yourView.clearAnimation();
relativeLayoutParams.setMargins(0, 0, 0, Utils.dpToPx(activity, newPositionDp);
yourView.setLayoutParams(relativeLayoutParams);
}
};
animation.setAnimationListener(animListener);
Utils.dptopx тоже могут быть полезны:
public final static int dpToPx(Context context, int dp) {
return ((int)((dp * context.getResources().getDisplayMetrics().density) + 0.5));
}