0

私の SMS アプリには、ユーザーが添付画像をクリックして展開すると開くダイアログがあります。

アニメーションを追加することを決定するまで、すべてがうまくいきました。このダイアログには 3 つのボタンがあります (1 つの閉じるボタンは右上隅にあり、2 つのボタンはダイアログの下部バーにあります)。ユーザーが画像をクリックすると、ボタンがアニメート/インします。ボタンが非表示になった後でもクリックできることを除いて、これはすべて正常に機能します。

アニメーションの前: 前

アニメーションの後: 後

以下のダイアログの私のコード:

// Declare these here to increase scope. (Listeners)
private static boolean ContainerChanged;
private static boolean ActionsHidden;
private static boolean AnimStarted;
private static boolean closeAnimFinished;
private static boolean barAnimFinished;

private void showExpandedImageDialog(Uri imgUri)
{
    // Initialize Dialog
    final Dialog dialog = new Dialog(ActivitySend.this, R.style.FullHeightDialog);
    dialog.setContentView(R.layout.dialog_attachment_image_send);

    // Initialize Views
    final RelativeLayout Container = (RelativeLayout) dialog.findViewById(R.id.Container);
    final LinearLayout actions = (LinearLayout) dialog.findViewById(R.id.Actions);
    final ImageButton btnClose = (ImageButton) dialog.findViewById(R.id.btnClose);
    Button btnReplace = (Button) dialog.findViewById(R.id.btnReplace);
    Button btnRemove = (Button) dialog.findViewById(R.id.btnRemove);
    ImageView image = (ImageView) dialog.findViewById(R.id.Image);

    // Load Image & Make Zoomable
    PhotoViewAttacher mAttacher = new PhotoViewAttacher(image);
    image.setImageURI(imgUri);
    mAttacher.update();

    // Get animations ready
    final Animation fiCloseAnim = AnimationUtils.loadAnimation(ActivitySend.this, R.anim.fade_in);
    fiCloseAnim.setFillEnabled(true);
    fiCloseAnim.setFillAfter(true);
    final Animation foCloseAnim = AnimationUtils.loadAnimation(ActivitySend.this, R.anim.fade_out);
    foCloseAnim.setFillEnabled(true);
    foCloseAnim.setFillAfter(true);
    final Animation dBarAnim = AnimationUtils.loadAnimation(ActivitySend.this, R.anim.slide_down);
    dBarAnim.setFillEnabled(true);
    dBarAnim.setFillAfter(true);
    final Animation uBarAnim = AnimationUtils.loadAnimation(ActivitySend.this, R.anim.slide_up);
    uBarAnim.setFillEnabled(true);
    uBarAnim.setFillAfter(true);

    // Reset static variables
    ActionsHidden = false;
    AnimStarted = false;
    closeAnimFinished = false;
    barAnimFinished = false;

    // Initialize listeners
    AnimationListener closeAnimListener = new AnimationListener()
    {
        @Override
        public void onAnimationEnd(Animation animation)
        {
            closeAnimFinished = true;
            if (closeAnimFinished && barAnimFinished)
            {
                AnimStarted = false;
                closeAnimFinished = false;
                barAnimFinished = false;

                if (ActionsHidden)
                {
                    actions.setVisibility(View.VISIBLE);
                    btnClose.setVisibility(View.VISIBLE);
                }
                else
                {
                    actions.setVisibility(View.GONE);
                    btnClose.setVisibility(View.GONE);
                }
                ActionsHidden = !ActionsHidden;
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {
            // Nothing
        }

        @Override
        public void onAnimationStart(Animation animation)
        {
            AnimStarted = true;
        }
    };
    AnimationListener barAnimListener = new AnimationListener()
    {
        @Override
        public void onAnimationEnd(Animation animation)
        {
            barAnimFinished = true;
            if (closeAnimFinished && barAnimFinished)
            {
                AnimStarted = false;
                closeAnimFinished = false;
                barAnimFinished = false;

                if (ActionsHidden)
                {
                    actions.setVisibility(View.VISIBLE);
                    btnClose.setVisibility(View.VISIBLE);
                }
                else
                {
                    actions.setVisibility(View.GONE);
                    btnClose.setVisibility(View.GONE);
                }
                ActionsHidden = !ActionsHidden;
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation)
        {
            // Nothing
        }

        @Override
        public void onAnimationStart(Animation animation)
        {
            AnimStarted = true;
        }
    };

    // Set listeners
    fiCloseAnim.setAnimationListener(closeAnimListener);
    foCloseAnim.setAnimationListener(closeAnimListener);
    dBarAnim.setAnimationListener(barAnimListener);
    uBarAnim.setAnimationListener(barAnimListener);

    // Actions Appear/Disappear onTap (Animate)
    mAttacher.setOnPhotoTapListener(new OnPhotoTapListener()
    {
        @Override
        public void onPhotoTap(View view, float x, float y)
        {
            if (!AnimStarted && ActionsHidden)
            {
                actions.startAnimation(uBarAnim);
                btnClose.startAnimation(fiCloseAnim);
            }
            else if (!AnimStarted)
            {
                actions.startAnimation(dBarAnim);
                btnClose.startAnimation(foCloseAnim);
            }
        }
    });

    // Make dialog square
    ContainerChanged = false;
    ViewTreeObserver vto = Container.getViewTreeObserver();
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
    {
        public boolean onPreDraw()
        {
            // Set boolean to save processing power
            if (!ContainerChanged)
            {
                int width = Container.getMeasuredWidth();
                Container.getLayoutParams().height = width;
                ContainerChanged = true;
            }

            return true;
        }
    });

    // Set button listeners
    btnClose.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            dialog.dismiss();
        }
    });
    btnReplace.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub
        }
    });
    btnRemove.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub
        }
    });

    // Show dialog
    dialog.show();
}

アニメーションを削除して使用するだけですべてが完全に機能しますview.setVisibility(View.GONE)が、アニメーションが本当に好きです...

これを修正するために何ができるかについてのアイデアはありますか? おそらく使用できますview.setClickable(false);が、それよりも優れた解決策があると確信しています。

4

1 に答える 1

0

次のように実行できます。

アクティビティに AnimationListener を実装させます。次に、オーバーライドされたメソッドがあり、3 つのボタンすべてに対してこのメ​​ソッドpublic void onAnimationEnd(Animation arg0)に書き込みsetClickable(false)または書き込みsetEnabled(false)、アニメーションを開始するときに再度有効にします....うまくいけば..

于 2013-09-26T05:41:50.190 に答える