Я использую LayoutTransition для постепенного появления и исчезновения изображения с полупрозрачным фоном, когда я устанавливаю видимость на VISIBLE и GONE соответственно. Стандартные вещи. У меня есть представление со сплошным фоном поверх (после, в XML) этого переходного представления. Я ожидаю, что пользователь увидит этот вид сверху со сплошным фоном, неизмененным на протяжении всего перехода, что является полной противоположностью анимации, которая запускается при появлении наложенного вида.
Аниматор APPEARING
работает так, как ожидалось: пользователь может видеть вид сверху на протяжении всей анимации. Аниматор DISAPPEARING
работает не так, как ожидалось: наложенный вид рисуется поверх всех остальных видов.
Возможно, стоит отметить, что это происходит, даже если вы не устанавливаете свой собственный LayoutTransition
и вместо этого полагаетесь на android:animateLayoutChanges="true"
в XML; Я добавил свой собственный, чтобы увеличить продолжительность, чтобы было легче увидеть переход.
Любые мысли о том, как обойти эту проблему? Я предполагаю, что это довольно распространено, и я должен упустить что-то очевидное, поскольку это поведение по умолчанию. Я пробовал несколько вещей, таких как добавление AnimatorUpdateListener
, чтобы сделать вид сверху недействительным в каждом кадре, установка моего собственного DISAPPEARING
ObjectAnimator
с прослушивателем обновлений, который делает недействительным вид сверху в каждом кадре, и замена наложенного вида на TextView
и другие типы просмотра только в случай FrameLayout
ведет себя каким-то особым образом.
Если я заменю аниматоры перехода обычным ObjectAnimator
, я получу ожидаемое поведение, за исключением того, что представление не GONE
и, следовательно, принимает события касания и весь этот мусор (что делает это «решение» несостоятельным). Таким образом, я не думаю, что проблема заключается только в том, что у переходного вида есть связанный аниматор. Похоже, что это конкретно проблема с кодом LayoutTransition
или с чем-то, что вызывает указание.
Основная деятельность:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View overlay = findViewById(R.id.overlay);
final LayoutTransition lt = new LayoutTransition();
lt.setDuration(LayoutTransition.APPEARING, 300);
lt.setStartDelay(LayoutTransition.APPEARING, 0);
lt.setDuration(LayoutTransition.DISAPPEARING, 1000);
lt.setStartDelay(LayoutTransition.DISAPPEARING, 0);
((ViewGroup) overlay.getParent()).setLayoutTransition(lt);
final Runnable runnable = new Runnable() {
@Override
public void run() {
if (overlay.getVisibility() == View.VISIBLE) {
overlay.setVisibility(View.GONE);
} else {
overlay.setVisibility(View.VISIBLE);
}
overlay.postDelayed(this, 1500);
}
};
overlay.post(runnable);
}
}
Activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#ff0000"
android:text="THIS IS BEHIND THE OVERLAY AND THUS SHOULD TINT"
android:textColor="#ffffff"
/>
<FrameLayout
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#7f00ff00"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_margin="64dp"
android:background="#ffffff"
android:gravity="center"
android:text="THIS VIEW IS IN FRONT OF THE OVERLAY AND THUS SHOULD NOT SUFFER TINTING"
android:textColor="#000000"
android:textSize="32sp"
/>
</RelativeLayout>
На моем устройстве работает API 22, и я также установил targetSdkVersion
на 22. По сути, я создал совершенно новый проект и изменил сгенерированные MainActivity
и activity_main.xml
, чтобы они почти точно соответствовали этим вставленным файлам (для краткости я исключил только строки import
и package
).