У меня есть ImageView
, который является потомком LinearLayout
.Если я анимирую ImageView
где-нибудь внутри LinearLayout
, onTouchListener()
реагирует после анимации, но перестает отвечать, если анимация перемещает представление за пределы прямого LinearLayout
родителя.
Другими словами, будет ли запущен ImageView
onTouchListener()
или нет, полностью зависит от того, находятся ли смещения x и y моей анимации в пределах родительского элемента LinearLayout
.
ObjectAnimator translateX =
ObjectAnimator.ofFloat(view, "translationX",
offSet_X);
ObjectAnimator translateY =
ObjectAnimator.ofFloat(view, "translationY",
offSet_Y);
translateX.setDuration(translationDurationMill);
translateX.start();
translateY.setDuration(translationDurationMill);
translateY.start();
Ожидается ли такое поведение или это может быть ошибка в моем коде?
edit
Так, например, я сократил проблему до простого приложения и убедился, что поведение - это не ошибка, а способ работы Android.но я не уверен, как обойти это поведение.
Итак, вот простой макет для основного действия
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:clipChildren="false"
android:clipToPadding="false"
>
<LinearLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@color/colorPrimary"
android:text="Hello World!"
android:gravity="center"
>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
android:text="hello world" />
</LinearLayout>
</LinearLayout>
Вот код основного действия
public class MainActivity extends AppCompatActivity
implements View.OnTouchListener{
int mTranslationDurationMill = 500;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
tv.setOnTouchListener(this);
animateTextView(tv,10,10);
}
private void animateTextView(View view, int offSet_X,int offSet_Y)
{
ObjectAnimator translateX =
ObjectAnimator.ofFloat(view, "translationX",
offSet_X);
ObjectAnimator translateY =
ObjectAnimator.ofFloat(view, "translationY",
offSet_Y);
translateX.setDuration(mTranslationDurationMill);
translateX.start();
translateY.setDuration(mTranslationDurationMill);
translateY.start();
}
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("TAG","onTouch()");
return false;
}
}
Выше у меня есть animateTextView(tv,10,10);
для анимации текстового представления, и после анимации я могу подтвердить, что журнал показывает событие касания, и вот картинка
но Если сделать animateTextView(tv,400,400);
, то представление выходит за пределы прямого родителя LinearLayout
, и событие касания не регистрируется.Вот картинка.