Als DialogFragment
Wrapper für die Dialog
Klasse 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:pivotY
ist 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:pivotX
Wert einerseits statisch ist. Andererseits können Sie den android:pivotY
Wert nicht programmgesteuert ändern .
Ich schlage vor, Sie definieren mehrere Animationen, von denen jede einen anderen Prozentwert für das android:pivotY
Attribut 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:pivotY
Wert 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 DialogFragment
einfache View
Wachsen von der exakten Mitte der Reihe aus zu vergessen und zu animieren .
Viel Glück!