1

为了实现动画弹出,我使用了自定义 DialogFragment 扩展 DialogFragment 类。然后,我在 xml 中设计了覆盖布局,并在加载弹出窗口时添加了它。因为,我需要做动画,所以我设计了 2 个动画 xml 文件并将其添加到 styles.xml 中,并在加载叠加层时添加了动画。

我在 3 个地方显示叠加动画。当我将它用作列表项中的组件以及将它与图像视图一起使用时,它完美地显示了,即从蜜蜂图标中生长出来并在蜜蜂图标中消失。但是当我将它与 VideoView 或 Exoplayer View 一起使用时,动画的起点向左移动 x 轴并向上移动 Y 轴。

此外,使用下面的三星 Note Edge 代码,弹出的动画与动画完美配合,但会导致三星 Galaxy S5 和 Nexus 4 出现上述问题。

它也可以正常工作,即当我不使用动画时,叠加层位于所有 3 个屏幕的蜜蜂所在的确切位置。所以,我猜错误是在动画中。

我正在提供示例代码,我写道。

自定义对话框片段:

public class ConfirmBox extends DialogFragment {
private View source;
private RelativeLayout relLayout;

public ConfirmBox() {
}

public ConfirmBox(View source) {
    this.source = source;
}

public ConfirmBox(View source,RelativeLayout relLayout) {
    this.source = source;
    this.relLayout =relLayout;
}

public static ConfirmBox newInstance(View source) {
    return new ConfirmBox(source);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(STYLE_NO_TITLE, 0);
}


@Override
public void onStart() {
    super.onStart();

    // Less dimmed background; see http://stackoverflow.com/q/13822842/56285
    Window window = getDialog().getWindow();
    WindowManager.LayoutParams params = window.getAttributes();
    params.dimAmount = 0.2f; // dim only a little bit
    window.setAttributes(params);

    // Transparent background; see http://stackoverflow.com/q/15007272/56285
    // (Needed to make dialog's alpha shadow look good)
    window.setBackgroundDrawableResource(android.R.color.transparent);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Put your dialog layout in R.layout.view_confirm_box
    final View view = inflater.inflate(R.layout.overlay_view, container, false);

    RelativeLayout layout = (RelativeLayout) view.findViewById(R.id.overlayLayout);


    layout.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View arg0) {

            getDialog().dismiss();

        }

    });

    setDialogPosition();

    return view;
}

/**
 * Try to position this dialog next to "source" view
 */
private void setDialogPosition() {
    if (source == null) {
        return; // Leave the dialog in default position
    }


    // Find out location of source component on screen
    // see http://stackoverflow.com/a/6798093/56285
    int[] location = new int[2];
    source.getLocationOnScreen(location);
    int sourceX = location[0];
    int sourceY = location[1];

    Log.d("CONFIRM BOX:", "X: " + sourceX + "Y: " + sourceY);
    Window window = getDialog().getWindow();

    window.getAttributes().windowAnimations = R.style.PauseDialogAnimation;

    // set "origin" to top left corner
    window.setGravity(Gravity.TOP| Gravity.LEFT);

    WindowManager.LayoutParams params = window.getAttributes();

    params.x = sourceX;
    params.y = sourceY - dpToPx(25);

    Log.d("CONFIRM BOX:","X: "+ sourceX + "Y: "+ sourceY);
    Log.d("CONFIRM BOX:","-----------------------------------------------------------");
    window.setAttributes(params);

    // Show the animation of the DialogueFragment
    window.getAttributes().windowAnimations = R.style.PauseDialogAnimation;

}

public int dpToPx(float valueInDp) {
    DisplayMetrics metrics = getActivity().getResources().getDisplayMetrics();
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, valueInDp, metrics);
}
}

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="100"
    android:duration="200"
    android:pivotX = "5%"
    android:pivotY = "-40%"
    />
<translate
    android:fromYDelta="50%"
    android:toYDelta="0"
    android:startOffset="100"
    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 = "5%"
    android:pivotY = "-40%"
    />
<translate
    android:fromYDelta="0"
    android:toYDelta="50%"
    android:duration="200"
    />
</set>

样式.xml:

<style name="PauseDialogAnimation">
    <item name="android:windowEnterAnimation">@anim/anim_in</item>
    <item name="android:windowExitAnimation">@anim/anim_out</item>
</style>

有人可以帮我解决这里的问题吗?

谢谢。

4

0 回答 0