Я пытаюсь добавить анимацию входа / выхода в DialogFragment, а также тусклую фоновую анимацию. Работают анимации входа и выхода, а также тусклая фоновая анимация при входе. Однако при выходе из DialogFragment анимация затемнения фона не работает должным образом.
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:gravity="center"
android:orientation="horizontal"
android:padding="10dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvTotal"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:maxLines="3"
android:padding="10dp"
android:scrollbars="vertical"
android:textColor="#FFFFFF"
android:textStyle="bold"
app:autoSizeMaxTextSize="100sp"
app:autoSizeMinTextSize="2sp"
app:autoSizeStepGranularity="2sp"
app:autoSizeTextType="uniform"
app:fontFamily="sans-serif"
android:lineSpacingMultiplier="2.5"
android:lineSpacingExtra="6dp" />
<ImageView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1"
android:contentDescription="@null"
android:importantForAccessibility="no"
app:srcCompat="@drawable/bitcoin" />
</LinearLayout>
activity_main_menu.xml:
fragment_bitcoin_information_dialog_menu_layout_background.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorPrimaryLight" />
<stroke android:width="5dp" android:color="@color/colorAccent" />
<corners android:radius="25dp" />
<!-- <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /> -->
</shape>
fragment_bitcoin_information_dialog.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="10dp"
android:background="@drawable/fragment_bitcoin_information_dialog_menu_layout_background"
android:orientation="vertical"
android:padding="50dp"
tools:context=".BitcoinInformationDialogFragment">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/btc_price_label"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<View
android:layout_width="wrap_content"
android:layout_height="5dp"
android:layout_marginTop="10dp"
android:background="@color/colorAccent" />
<TextView
android:id="@+id/tvPrice"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:gravity="center"
android:textColor="@android:color/black"
android:textSize="18sp" />
<TextView
android:id="@+id/textView7"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="45dp"
android:gravity="center"
android:text="@string/btc_in_circulation_label"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<View
android:layout_width="wrap_content"
android:layout_height="5dp"
android:layout_marginTop="10dp"
android:background="@color/colorAccent" />
<TextView
android:id="@+id/tvCirculation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:gravity="center"
android:textColor="@android:color/black"
android:textSize="18sp" />
<TextView
android:id="@+id/textView8"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="45dp"
android:gravity="center"
android:text="@string/my_net_worth_label"
android:textColor="@android:color/black"
android:textSize="24sp"
android:textStyle="bold" />
<View
android:layout_width="wrap_content"
android:layout_height="5dp"
android:layout_marginTop="10dp"
android:background="@color/colorAccent" />
<TextView
android:id="@+id/tvNet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:gravity="center"
android:textColor="@android:color/black"
android:textSize="18sp" />
</LinearLayout>
</ScrollView>
</LinearLayout>
аним / scale_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="0.0"
android:fromYScale="0.0"
android:toXScale="1.0"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="5000" />
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
android:duration="5000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator" />
</set>
Этот код работает. Для того чтобы затемнить фоновое значение 0,7 и 5 секунд (5000 миллисекунд для DialogFragment) для полной видимости требуется как 5 секунд (5000 миллисекунд), так и фон.
аним / scale_out.xml:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1.0"
android:fromYScale="1.0"
android:toXScale="0"
android:toYScale="0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="5000" />
<alpha
android:fromAlpha="1.0"
android:toAlpha="0"
android:duration="5000"
android:interpolator="@android:anim/accelerate_decelerate_interpolator" />
</set>
Этот код не работает. DialogFragment занимает 5 секунд (5000 миллисекунд для DialogFragment), чтобы быть полностью невидимым. Однако анимация затемнения фона с альфа-значением от 0,7 до 1,0 происходит практически мгновенно. Это мой вопрос: как сделать так, чтобы анимация длилась 5 секунд (5000 миллисекунд) и заканчивалась одновременно с анимацией выхода?
styles.xml:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="DialogScale" parent="@android:style/Animation.Activity">
<item name="android:windowEnterAnimation">@anim/scale_in</item>
<item name="android:windowExitAnimation">@anim/scale_out</item>
</style>
<style name="DialogTheme" parent="@android:style/Theme.Dialog">
<item name="android:windowAnimationStyle">@style/DialogScale</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowActionModeOverlay">false</item>
<item name="android:windowCloseOnTouchOutside">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimAmount">0.7</item>
</style>
</resources>
Мне кажется, что ответ находится где-то в этом файле. Неужели?
MainActivity.java:
package com.shikhar_mainalee.iownallbitcoin;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.content.FileProvider;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.ShareActionProvider;
import android.text.method.ScrollingMovementMethod;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import static com.shikhar_mainalee.iownallbitcoin.Main.NUMBER_OF_CURRENT_BITCOINS_AS_STRING;
import static com.shikhar_mainalee.iownallbitcoin.Main.OnBitcoinInformationChangedListener;
import static com.shikhar_mainalee.iownallbitcoin.Main.mMainActivityOnBitcoinInformationChangedListener;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_info:
BitcoinInformationDialogFragment.newInstance().show(getSupportFragmentManager(), "fragment_bitcoin_information_dialog");
break;
}
return true;
}
}
BitcoinInformationDialogFragment.java:
package com.shikhar_mainalee.iownallbitcoin;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import static com.shikhar_mainalee.iownallbitcoin.Main.OnBitcoinInformationChangedListener;
import static com.shikhar_mainalee.iownallbitcoin.Main.mBitcoinInformationDialogFragmentOnBitcoinInformationChangedListener;
public class BitcoinInformationDialogFragment extends DialogFragment {
public BitcoinInformationDialogFragment() {
}
public static BitcoinInformationDialogFragment newInstance() {
return new BitcoinInformationDialogFragment();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
setStyle(STYLE_NORMAL, R.style.DialogTheme);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
return inflater.inflate(R.layout.fragment_bitcoin_information_dialog, container);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
}
Как исправить эту ошибку?
P.S. Вот ссылка на текущий предварительный просмотр.
https://drive.google.com/file/d/1JTJf_uZsxzGdiWKL_234hOQBubW_b4Eo/view?usp=sharing
EDIT: Я обнаружил, что анимация выхода DialogFragment и тусклая фоновая анимация занимают 5 секунд (5000 миллисекунд) на более новых уровнях API, но не на более старых. Как сделать так, чтобы оно работало и на старых версиях?