4

PopupWindowユーザーがリスト内のアイテムを選択したときにポップアップするを作成しました。次に、ポップアップウィンドウを左右にスワイプすると、(ポップアップ内の)データがリスト内の前の項目と次の項目にそれぞれ変更されます。

そして、ユーザーが指を右にスライドすると、現在のポップアップウィンドウが画面の右から消えるように、新しいポップアップウィンドウが左からスライドしているように見えるようにしました(「次へ」の動き)。「前の」モーションの場合はその逆です。

しかし、問題は、2つのアニメーションに対して2つのスタイルを作成したため(左から中へは中から右、右から中へは中から左)、PopupWindowsは更新されないためです。が表示されている場合、ユーザーが右(「次へ」)にスワイプしてから左(「前へ」)にスワイプすると、2つのアニメーションが重なるため、アニメーションが途切れ途切れに見えます。スワイプを再び逆にしたときにも同じことが起こります。

さて、update()アニメーションを変更した後に呼び出すと、再び中央にスライドします。それはさらに悪いことです。それで、私が望む行動を達成するために私ができることはありますか?

ありがとう。

編集:ソースコード

これが私が初めてポップアップを表示するために使用したコードです:

popup1 = new PopupWindow(popupLayout, popup_width, popup_height, true);
popup1.setAnimationStyle(R.style.AnimationPopup);
popup1.showAtLocation(this.findViewById(R.id.main_container), Gravity.CENTER, 0, 0);

そして、これはnext()メソッドのコードです:

if(popup2 != null) popup1 = popup2;
if(popup1 != null) {
    popup2 = new PopupWindow(popupLayout, popup_width, popup_height, true);
    popup2.setAnimationStyle(R.style.AnimationPopup);

    popup1.dismiss();
    popup2.showAtLocation(rootLayout, Gravity.CENTER, 0, 0);
}

そして、これはprev()メソッドのコードです:

if(popup2 != null) popup1 = popup2;
if(popup1 != null) {
    popup2 = new PopupWindow(popupLayout, popup_width, popup_height, true);
    popup2.setAnimationStyle(R.style.AnimationPopupReverse);

    popup1.setAnimationStyle(R.style.AnimationPopupReverse);
    popup1.dismiss();

    popup2.showAtLocation(rootLayout, Gravity.CENTER, 0, 0);
}

Javaコードは以上です。これは、右から中央へのスライドの単純な表示と、中央から左へのスライドのアニメーションの非表示AnimationPopupを備えたXMLです。そして、これは上記のアニメーションの逆です。AnimationPopupReverse

私はコードの最初の試みを提供しました。ここで、変更されたアニメーションは、もう1つのポップアップが表示された後に有効になります。

4

2 に答える 2

2

android:hardwareAccelerated="true"application タグの下のマニフェストで使用すると、すべてのアニメーションがよりきれいに表示されます。通常の左右のスライド アニメーションでさえ、ハードウェア アクセラレーションなしでは途切れ途切れに見えます。

于 2013-03-26T10:40:45.803 に答える
1

簡単な解決策は次のとおりです。

  1. 現在のアニメーションが終了するまでスワイプを無効にします。
  2. 使用android:duration="@android:integer/config_mediumAnimTime"して、かなり標準的で高速にします。

ある種のドラッグを実装することもできます:

タッチ イベントをキャッチし、それに応じてポップアップの場所を変更します。ユーザーが指を離すと、スワイプをディスパッチし、次/前のポップアップ ウィンドウを表示します。これには、実際には頭を悩ませることが含まれます。


最善の方法は、スワイプのすべての機能が実装されたポップアップ ウィンドウを表示する ViewPager を使用することです。

例:

yourViewPager.setAdapter(new PagerAdapter() {
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        View view;
        //intialise view to a PopupWindow or some Layout with a PopupWindow in the location you want
        container.addView(view, 0);
        return view;
    }
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return (view==object);
    }

    @Override
    public int getCount() {
        //return the count
    }
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View)object);
    }
    @Override
    public void finishUpdate(ViewGroup arg0) {
    }

    @Override
    public void restoreState(Parcelable arg0, ClassLoader arg1) {
    }

    @Override
    public Parcelable saveState() {
        return null;
    }

    @Override
    public void startUpdate(ViewGroup arg0) {
    }
});
于 2013-03-26T10:22:57.897 に答える