翻转动画在viewpager android内的视图上

时间:2016-02-19 07:42:57

标签: android android-fragments android-animation

我已经尝试了一段时间,但我无法旋转viewpager中的片段视图。单击位于viewpager的父片段视图上。我一直得到空指针异常。我在上面的代码行中评论了我得到的异常。

MainFragment

     int item = mViewPager.getCurrentItem();
            Fragment frag = (Fragment) mSectionsPagerAdapter.getItem(item);
            final View containers = frag.getView();
            rootView.findViewById(R.id.flipCard).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(getActivity().getApplicationContext(), "Working ", Toast.LENGTH_SHORT).show();
//**Exception at below line**
                    View rootLayout = (View) containers.findViewById(R.id.card_view);

                    View cardFace = (View) containers.findViewById(R.id.mainLayout);
                    View cardBack = (View) containers.findViewById(R.id.mainLayout2);
                    if (cardFace == null || cardBack == null) {
                        Toast.makeText(getActivity().getApplicationContext(), "Null View", Toast.LENGTH_SHORT).show();
                    }
                    FlipAnimation flipAnimation = new FlipAnimation(cardFace, cardBack);

                    if (cardFace.getVisibility() == View.GONE) {
                        flipAnimation.reverse();
                    }
                    rootLayout.startAnimation(flipAnimation);
                }
            });

FlipAnimation

public class FlipAnimation extends Animation {
    private Camera camera;

    private View fromView;
    private View toView;

    private float centerX;
    private float centerY;

    private boolean forward = true;

    /**
     * Creates a 3D flip animation between two views.
     *
     * @param fromView First view in the transition.
     * @param toView   Second view in the transition.
     */
    public FlipAnimation(View fromView, View toView) {
        this.fromView = fromView;
        this.toView = toView;

        setDuration(700);
        setFillAfter(false);
        setInterpolator(new AccelerateDecelerateInterpolator());
    }

    public void reverse() {
        forward = false;
        View switchView = toView;
        toView = fromView;
        fromView = switchView;
    }

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        centerX = width / 2;
        centerY = height / 2;
        camera = new Camera();
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        // Angle around the y-axis of the rotation at the given time
        // calculated both in radians and degrees.
        final double radians = Math.PI * interpolatedTime;
        float degrees = (float) (180.0 * radians / Math.PI);

        // Once we reach the midpoint in the animation, we need to hide the
        // source view and show the destination view. We also need to change
        // the angle by 180 degrees so that the destination does not come in
        // flipped around
        if (interpolatedTime >= 0.5f) {
            degrees -= 180.f;
            fromView.setVisibility(View.GONE);
            toView.setVisibility(View.VISIBLE);
        }

        if (forward)
            degrees = -degrees; //determines direction of rotation when flip begins

        final Matrix matrix = t.getMatrix();
        camera.save();
        camera.rotateY(degrees);
        camera.getMatrix(matrix);
        camera.restore();
        matrix.preTranslate(-centerX, -centerY);
        matrix.postTranslate(centerX, centerY);
    }
}

logcat的

  

致命的例外:主要                                                                       过程:com.productrx.yelome,PID:2656                                                                       java.lang.NullPointerException:尝试调用虚方法   'android.view.View android.view.View.findViewById(int)'上的null   对象参考                                                                           在   com.productrx.yelome.fragments.ChooseTemplate $ 2 $ 1.onClick(ChooseTemplate.java:106)                                                                           在android.view.View.performClick(View.java:4855)                                                                           在android.view.View $ PerformClick.run(View.java:20278)                                                                           在android.os.Handler.handleCallback(Handler.java:815)                                                                           在android.os.Handler.dispatchMessage(Handler.java:104)                                                                           在android.os.Looper.loop(Looper.java:194)                                                                           在android.app.ActivityThread.main(ActivityThread.java:5631)                                                                           at java.lang.reflect.Method.invoke(Native Method)                                                                           在java.lang.reflect.Method.invoke(Method.java:372)                                                                           在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:959)                                                                           在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)

1 个答案:

答案 0 :(得分:1)

将此代码放在片段的oncreateview中,以防您没有,因此您不需要调用在您的情况下返回null的frag.getview()。