显示DialogFragment,动画从一个点开始增长

Edw*_*ale 86 android android-animation android-fragments

我正在显示DialogFragment当用户点击一行中的一行时ListView.我想为对话框的显示设置动画,使其从行的中心开始增长.从启动器打开文件夹时可以看到类似的效果.

,我已经有一个想法是组合TranslateAnimationScaleAnimation.还有另外一种方法吗?

Xav*_*Gil 161

作为课程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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你只需要定义包含你想要的动画的主题.在styles.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>    
Run Code Online (Sandbox Code Playgroud)

现在将动画文件添加到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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

最后,这里的棘手问题是让你的动画从每一行的中心增长.我想这行是水平填充屏幕,所以一方面android:pivotX价值是静态的.另一方面,您无法以android:pivotY编程方式修改该值.

我建议你定义几个动画,每个动画在android:pivotY属性上有不同的百分比值(以及引用这些动画的几个主题).然后,当用户点击该行时,以屏幕上行的百分比计算Y位置.知道百分比的位置,为对话框指定一个具有适当android:pivotY值的主题.

它不是一个完美的解决方案,但可以帮助你.如果你不喜欢这个结果,那么我建议你忘记从行的确切中心开始DialogFragment简单地View生长和动画.

祝好运!

  • 设置主题可以像在 `onCreate(bundle)` 上执行 `setStyle(DialogFragment.STYLE_NORMAL, R.style.MyCustomTheme)` 一样简单,参见:https://developer.android.com/reference/android/app/DialogFragment.html (2认同)

Kir*_*abu 106

看看这段代码,它对我有用

//向上滑动动画

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="100%"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toXDelta="0" />

</set>
Run Code Online (Sandbox Code Playgroud)

//滑动dowm动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="@android:integer/config_mediumAnimTime"
        android:fromYDelta="0%p"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toYDelta="100%p" />

</set>
Run Code Online (Sandbox Code Playgroud)

//风格

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>
Run Code Online (Sandbox Code Playgroud)

//内部对话框片段

@Override
public void onActivityCreated(Bundle arg0) {
    super.onActivityCreated(arg0);
    getDialog().getWindow()
    .getAttributes().windowAnimations = R.style.DialogAnimation;
}
Run Code Online (Sandbox Code Playgroud)

  • 对不起,这根本不回答我的问题. (7认同)
  • 这可能不是OP所要求的,但我认为这是一个很好的切入点. (3认同)
  • 这可能很有用,但它根本不回答这个问题. (3认同)
  • 我尝试了这个代码,它的工作原理!非常聪明. (2认同)
  • 很好的例子!唯一适合我的样本.Trick是在onActivityCreated(...)方法中设置动画/主题 (2认同)

Sia*_*ash 21

DialogFragment有一个公共的getTheme()方法,你可以根据这个原因骑车.此解决方案使用较少的代码行:

public class MyCustomDialogFragment extends DialogFragment{
    ...
    @Override
    public int getTheme() {
        return R.style.MyThemeWithCustomAnimation;
    }
}
Run Code Online (Sandbox Code Playgroud)


maX*_*aXp 9

要获得带动画的全屏对话框,请写下以下内容......

样式:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionModeBackground">?attr/colorPrimary</item>
    <item name="windowActionModeOverlay">true</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="AppTheme.NoActionBar.FullScreenDialog">
    <item name="android:windowAnimationStyle">@style/Animation.WindowSlideUpDown</item>
</style>

<style name="Animation.WindowSlideUpDown" parent="@android:style/Animation.Activity">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>
Run Code Online (Sandbox Code Playgroud)

RES /动画/ slide_up.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="@android:interpolator/accelerate_quad">

    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromYDelta="100%"
        android:toYDelta="0%"/>
</set>
Run Code Online (Sandbox Code Playgroud)

RES /动画/ slide_down.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="@android:interpolator/accelerate_quad">

    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromYDelta="0%"
        android:toYDelta="100%"/>
</set>
Run Code Online (Sandbox Code Playgroud)

Java代码:

public class MyDialog extends DialogFragment {

    @Override
    public int getTheme() {
        return R.style.AppTheme_NoActionBar_FullScreenDialog;
    }
}

private void showDialog() {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    Fragment previous = getSupportFragmentManager().findFragmentByTag(MyDialog.class.getName());
    if (previous != null) {
        fragmentTransaction.remove(previous);
    }
    fragmentTransaction.addToBackStack(null);

    MyDialog dialog = new MyDialog();
    dialog.show(fragmentTransaction, MyDialog.class.getName());
}
Run Code Online (Sandbox Code Playgroud)


Bro*_*Han 6

在DialogFragment中,自定义动画称为onCreateDialog。“DialogAnimation”是之前答案中的自定义动画样式。

public Dialog onCreateDialog(Bundle savedInstanceState) 
{
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
    return dialog;
}
Run Code Online (Sandbox Code Playgroud)


gre*_*eve 1

您看过有关缩放视图的 Android 开发人员培训吗?可能是一个很好的起点。

您可能想要创建一个自定义类来扩展DialogFragment以使其正常工作。

另外,请查看 Jake Whartons NineOldAndroids的 Honeycomb 动画 API 兼容性,直至 API 级别 1。