17

現在参考になっているように見えるので、プロジェクトで Google Plus アプリケーションを模倣しようとしています。

スクロール時のリストビュー効果は本当に素晴らしく、似たようなことをしたいと思っています。

私は LayoutAnimationController http://android-er.blogspot.be/2009/10/listview-and-listactivity-layout.htmlから始めました

LayoutAnimationController controller 
   = AnimationUtils.loadLayoutAnimation(
     this, R.anim.list_layout_controller);
  getListView().setLayoutAnimation(controller);

すべての要素がアニメーション化されているわけではないため、これは悪いようです。

だから私はアダプターの getView を使用してこれを使用して終了しました:

        AnimationSet set = new AnimationSet(true);

        Animation animation = new AlphaAnimation(0.0f, 1.0f);
        animation.setDuration(800);
        set.addAnimation(animation);

        animation = new TranslateAnimation(
            Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f,
            Animation.RELATIVE_TO_SELF, 1.0f,Animation.RELATIVE_TO_SELF, 0.0f
        );
        animation.setDuration(600);
        set.addAnimation(animation);

        row.startAnimation(set);

結果は素晴らしく、本当に満足しています!

残念ながら、リストを上から下にスクロールした場合にのみ機能します。

反対側にスクロールするときに機能させたいのですが、TranslateAnimation を少し変更する必要があります。

私の質問は、アダプタで上方向または下方向にスクロールしたかどうかを検出する方法はありますか?

4

11 に答える 11

23

を に割り当てOnScrollListenerますListView。ユーザーが上下にスクロールしているかどうかを示すフラグを作成します。現在の最初の可視アイテムの位置が以前の最初の可視アイテムの位置より大きいか小さいかをチェックして、フラグに適切な値を設定します。そのチェックを の中に入れonScrollStateChanged()ます。

サンプルコード:

private int mLastFirstVisibleItem;
private boolean mIsScrollingUp;

public void onScrollStateChanged(AbsListView view, int scrollState) {
    final ListView lw = getListView();

    if (view.getId() == lw.getId()) {
        final int currentFirstVisibleItem = lw.getFirstVisiblePosition();

        if (currentFirstVisibleItem > mLastFirstVisibleItem) {
            mIsScrollingUp = false;
        } else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
            mIsScrollingUp = true;
        }

        mLastFirstVisibleItem = currentFirstVisibleItem;
    } 
}

mIsScrollingUpで が true か falseかを確認しgetView()、それに応じてアニメーションを割り当てます。

于 2012-08-24T18:58:22.227 に答える
19

私はこれをやって終わった:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.i("",position+" - "+lastposition);

    if (position >= lastposition)
        animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
                0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
                Animation.RELATIVE_TO_SELF, 1.0f,
                Animation.RELATIVE_TO_SELF, 0.0f);
    else
        animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF,
                0.0f, Animation.RELATIVE_TO_SELF, 0.0f,
                Animation.RELATIVE_TO_SELF, -1.0f,
                Animation.RELATIVE_TO_SELF, 0.0f);

    animation.setDuration(600);
    set.addAnimation(animation);

    row.startAnimation(set);

    lastposition = position;

}
于 2012-08-24T19:21:04.137 に答える
5

より複雑なソリューション (リストビューで長いアイテムの高さを操作する)

  1. カスタム リストビューを作成する

    public class ScrollDetectingListView extends ListView {
        public ScrollDetectingListView(Context context) {
            super(context);
        }
    
        public ScrollDetectingListView(Context context, AttributeSet attrs) {
            super(context,attrs);
        } 
    
        public ScrollDetectingListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        //we need this protected method for scroll detection
        public int getVerticalScrollOffset() {
            return computeVerticalScrollOffset();
        }
    }
    
  2. onScroll をオーバーライドする

        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
    
        private int mInitialScroll = 0;
    
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
    
        }
    
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            int scrolledOffset = listView.getVerticalScrollOffset();
            if (scrolledOffset!=mInitialScroll) {
                //if scroll position changed
                boolean scrollUp = (scrolledOffset - mInitialScroll) < 0;
                mInitialScroll = scrolledOffset;
            }
        }
        });
    
于 2014-08-29T08:45:04.167 に答える
5

受け入れられた回答は、スクロールアップまたはダウンを実際に「検出」しません。現在表示されているアイテムが非常に大きい場合は機能しません。使用onTouchListenerする方法です。

これは私が使用したコードスニペットです:

listView.setOnTouchListener(new View.OnTouchListener() {
    float initialY, finalY;
    boolean isScrollingUp;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = MotionEventCompat.getActionMasked(event);

        switch(action) {
            case (MotionEvent.ACTION_DOWN):
                initialY = event.getY();
            case (MotionEvent.ACTION_UP):
                finalY = event.getY();

                if (initialY < finalY) {
                    Log.d(TAG, "Scrolling up");
                    isScrollingUp = true;
                } else if (initialY > finalY) {
                    Log.d(TAG, "Scrolling down");
                    isScrollingUp = false;
                }
            default:
        }

        if (isScrollingUp) {
            // do animation for scrolling up
        } else {
            // do animation for scrolling down
        }

        return false; // has to be false, or it will freeze the listView
    }
});
于 2015-05-23T16:20:54.090 に答える
2

これが私のアプローチです。スクロールした量について、より迅速なフィードバックを得ることが OnScrollできます: 、リストの最初の項目のトップ位置を取得するだけです。実際のスクロール位置情報をすぐに取得できるのはかなり信頼できます。

listView.getChildAt(0).getTop()
于 2013-05-06T18:25:42.807 に答える
0
list.setOnScrollListener(new OnScrollListener() {
        int last_item;
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {

        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if(last_item<firstVisibleItem+visibleItemCount-1){
                System.out.println("List is scrolling upwards");
            }
            else if(last_item>firstVisibleItem+visibleItemCount-1){
                System.out.println("List is scrolling downwards");
            }
             last_item = firstVisibleItem+visibleItemCount-1;
        }
    });

最後の表示項目の位置に基づいて、リストビューが上がるか下がるかを決定します。

于 2015-04-14T12:21:14.350 に答える
0
view.setOnTouchListener(new View.OnTouchListener() {

        private long startClickTime;
        float y0 = 0;
        float y1 = 0;
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                y0 = motionEvent.getY();
                startClickTime = System.currentTimeMillis();

            } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                if (System.currentTimeMillis() - startClickTime < ViewConfiguration.getTapTimeout()) {

                    // Touch was a simple tap. Do whatever.

                } else {
                    y1 = motionEvent.getY();
                    // Touch was a not a simple tap.
                    if (y1 - y0 > 50) {
                        // this is down
                    } else if (y1 - y0 < 50) {
                        Log.d("daniY", "-");
                        // this is up
                    }
                }

            }

            return true;
        }

    });

これは私にとってはうまくいきました。これは、私が考えるすべてのビューでスクロールの方向を検出するのに役立ちます。

于 2020-11-19T23:29:36.613 に答える