Als DialogFragmentWrapper für die DialogKlasse sollten Sie ein Thema für Ihre Basis festlegen Dialog, um die gewünschte Animation zu erhalten:
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();
}
}
Dann müssen Sie nur noch das Thema definieren, das Ihre gewünschte Animation enthält. Fügen Sie in styles.xml Ihr benutzerdefiniertes Thema hinzu:
<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>
Fügen Sie nun die Animationsdateien im Ordner res / anim hinzu:
(das android:pivotYist der Schlüssel)
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>
Schließlich ist es hier schwierig, Ihre Animation aus der Mitte jeder Zeile heraus wachsen zu lassen. Ich nehme an, die Zeile füllt den Bildschirm horizontal aus, sodass der android:pivotXWert einerseits statisch ist. Andererseits können Sie den android:pivotYWert nicht programmgesteuert ändern .
Ich schlage vor, Sie definieren mehrere Animationen, von denen jede einen anderen Prozentwert für das android:pivotYAttribut hat (und mehrere Themen, die auf diese Animationen verweisen). Wenn der Benutzer auf die Zeile tippt, berechnen Sie die Y-Position in Prozent der Zeile auf dem Bildschirm. Wenn Sie die Position in Prozent kennen, weisen Sie Ihrem Dialogfeld ein Thema mit dem entsprechenden android:pivotYWert zu.
Es ist keine perfekte Lösung, könnte aber den Trick für Sie tun. Wenn Ihnen das Ergebnis nicht gefällt, würde ich vorschlagen, das DialogFragmenteinfache ViewWachsen von der exakten Mitte der Reihe aus zu vergessen und zu animieren .
Viel Glück!