我如何在对话片段中实现片段之间的翻转过渡



我有两个对话框片段:

  • 我需要在它们之间进行翻转过渡
  • 我检查了安卓开发者网站,但它解释了片段过渡 https://developer.android.com/training/animation/reveal-or-hide-view.html#CardFlip

如何在对话片段中实现相同的内容?

演示如何将动画设置为对话框碎片的示例

由于 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();
}
}

然后,您只需要定义将包含所需动画的主题。在样式中.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 文件夹中添加动画文件:

(安卓:枢轴是关键)

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 并从行的正中心开始对一个简单的视图进行动画处理。

最新更新