Анимация фрагмента пользовательского диалога в Android

Для создания анимированного всплывающего окна я использовал пользовательский DialogFragment, расширяющий класс DialogFragment. Затем я разработал макет наложения в xml и добавил его во время загрузки всплывающего окна. Поскольку мне нужно было сделать анимацию, я разработал 2 анимационных XML-файла и добавил это в styles.xml и добавил анимацию во время загрузки наложения.

Я показываю оверлейную анимацию в 3 местах. Он показывает отлично, т.е. растет из значка Bee и исчезает в значке Bee, когда я использую его как компонент в элементе списка и когда я использую его вместе с представлением изображения. Но когда я использую его вместе с VideoView или Exoplayer View, начальная точка анимации сдвигается влево для оси x и поднимается вверх для оси Y.

Кроме того, всплывающее окно вместе с анимацией отлично работает с использованием приведенного ниже кода для Samsung Note Edge, но вызывает вышеуказанную проблему для Samsung 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://stackru.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://stackru.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://stackru.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>

styles.xml:

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

Может ли кто-нибудь любезно помочь мне сосредоточиться на проблеме здесь?

Благодарю.

0 ответов

Другие вопросы по тегам