Будучи DialogFragment
обгорткою для Dialog
класу, ви повинні встановити тему для своєї бази, Dialog
щоб отримати потрібну анімацію:
public class CustomDialogFragment extends DialogFragment implements OnEditorActionListener
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
// Set a theme on the dialog builder constructor!
AlertDialog.Builder builder =
new AlertDialog.Builder( getActivity(), R.style.MyCustomTheme );
builder
.setTitle( "Your title" )
.setMessage( "Your message" )
.setPositiveButton( "OK" , new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss();
}
});
return builder.create();
}
}
Тоді вам просто потрібно визначити тему, яка буде включати бажану анімацію. У style.xml додайте власну тему:
<style name="MyCustomTheme" parent="@android:style/Theme.Panel">
<item name="android:windowAnimationStyle">@style/MyAnimation.Window</item>
</style>
<style name="MyAnimation.Window" parent="@android:style/Animation.Activity">
<item name="android:windowEnterAnimation">@anim/anim_in</item>
<item name="android:windowExitAnimation">@anim/anim_out</item>
</style>
Тепер додайте файли анімації в папку res / anim :
( android:pivotY
це ключ)
anim_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/linear_interpolator"
android:fromXScale="0.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:fillAfter="false"
android:startOffset="200"
android:duration="200"
android:pivotX = "50%"
android:pivotY = "-90%"
/>
<translate
android:fromYDelta="50%"
android:toYDelta="0"
android:startOffset="200"
android:duration="200"
/>
</set>
anim_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/linear_interpolator"
android:fromXScale="1.0"
android:toXScale="0.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:fillAfter="false"
android:duration="200"
android:pivotX = "50%"
android:pivotY = "-90%"
/>
<translate
android:fromYDelta="0"
android:toYDelta="50%"
android:duration="200"
/>
</set>
Нарешті, складна справа полягає в тому, щоб ваша анімація зростала з центру кожного рядка. Я припускаю, що рядок заповнює екран горизонтально, тому, з одного боку,android:pivotX
значення буде статичним. З іншого боку, ви не можете програмно змінити android:pivotY
значення.
Я пропоную вам визначити кілька анімацій, кожна з яких має різне відсоткове значення на android:pivotY
атрибута (і кілька тем, що посилаються на ці анімації). Потім, коли користувач натискає рядок, обчисліть позицію Y у відсотках від рядка на екрані. Знаючи позицію у відсотках, призначте вашому діалогу тему, яка має відповідне android:pivotY
значення.
Це не ідеальне рішення, але може зробити трюк за вас. Якщо вам не подобається результат, я б запропонував забутиDialogFragment
та анімувати просте View
вирощування з точного центру рядка.
Удачі!