Samsung Galaxy S2 2.3.5+ не вызывает overScrollBy () - PullRequest
8 голосов
/ 13 февраля 2012

Похоже, что Samsung отключил их превышение (вероятно, из-за иска Apple).

У меня есть реализация представления, которая расширяет ScrollView и переопределяет

    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY,int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent)
    {
     ...
     return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, 0, metrics.widthPixels,isTouchEvent);
    }

на всех остальныхустройство (Gingerbread и выше), overScrollBy вызывается, когда скроллер достигает своего конца, и пользователь может на самом деле прокручивать представление).

На Android 2.3.5+ Samsung реализовали какую-тоМеханизм, который полностью отключает избыточную прокрутку (не только их реализацию, но и реализацию Android), и каждый раз, когда пользователь пытается выполнить избыточную прокрутку, выводится следующее событие LogCat:

02-13 16:02:34.230: D/BounceScrollRunnableDefault(15783): run(), TimeFraction=0.5225, mBounceExtent=7.273352

Есть ли способ разблокировкичто там делал самсунг?Или, может быть, другой способ создать оверскроллер?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2012

Проблема решена, я создал свой собственный OverScrollView, вы можете использовать его. https://github.com/EverythingMe/OverScrollView

3 голосов
/ 11 сентября 2012

Я только что столкнулся с той же проблемой и, наконец, придумал следующее пользовательское обнаружение превышения прокрутки:

    listView.setOnTouchListener(new OnTouchListener() {

        private static final float OVERSCROLL_THRESHOLD_IN_PIXELS = 70;

        private float downY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int firstVisibleItem = listView.getFirstVisiblePosition();
            int totalItemCount = listView.getCount();
            int visibleItemCount = listView.getChildCount();
            boolean onTop = firstVisibleItem == 0 && listView.getChildAt(0) != null && listView.getChildAt(0).getTop() == 0;
            boolean onBottom = firstVisibleItem + visibleItemCount == totalItemCount && listView.getChildAt(visibleItemCount-1).getBottom() == listView.getHeight();

            if(onTop || onBottom) {
                switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    downY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    float deltaY = event.getY() - downY;
                    if(onTop && deltaY > OVERSCROLL_THRESHOLD_IN_PIXELS) {
                        // Top overscroll
                    }
                    if(onBottom && -deltaY > OVERSCROLL_THRESHOLD_IN_PIXELS) {
                        // Bottom overscroll
                    }
                    break;
                }
            }

            return false;
        }
    });
...