Android Open Source - Common-Library Scroll Detectors






From Project

Back to project page Common-Library.

License

The source code is released under:

Apache License

If you think the Android project Common-Library listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.morgan.library.widget.slidemenu;
/*from   w ww  . ja v a 2  s. com*/
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.WeakHashMap;

import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.webkit.WebView;
import android.widget.HorizontalScrollView;

public class ScrollDetectors {
  private static final WeakHashMap<Class<?>, ScrollDetector> IMPLES = new WeakHashMap<Class<?>, ScrollDetector>();
  private static ScrollDetectorFactory mFactory;

  /**
   * Check the view is horizontal scrollable
   * 
   * @param v
   * @param direction
   * @return
   */
  public static boolean canScrollHorizontal(View v, int direction) {
    ScrollDetector imples = getImplements(v);
    if (null == imples) {
      return false;
    }
    return imples.canScrollHorizontal(v, direction);
  }

  /**
   * Check the view is vertical scrollable
   * 
   * @param v
   * @param direction
   * @return
   */
  public static boolean canScrollVertical(View v, int direction) {
    ScrollDetector imples = getImplements(v);
    if (null == imples) {
      return false;
    }
    return imples.canScrollVertical(v, direction);
  }

  private static ScrollDetector getImplements(View v) {
    Class<?> clazz = v.getClass();
    ScrollDetector imple = IMPLES.get(clazz);

    if (null != imple) {
      return imple;
    }

    if (v instanceof ViewPager) {
      imple = new ViewPagerScrollDetector();
    } else if (v instanceof HorizontalScrollView) {
      imple = new HorizontalScrollViewScrollDetector();
    } else if (v instanceof WebView) {
      imple = new WebViewScrollDetector();
    } else if (null != mFactory) {
      imple = mFactory.newScrollDetector(v);
    } else {
      return null;
    }

    IMPLES.put(clazz, imple);
    return imple;
  }

  private static class ViewPagerScrollDetector implements ScrollDetector {

    @Override
    public boolean canScrollHorizontal(View v, int direction) {
      ViewPager viewPager = (ViewPager) v;
      PagerAdapter pagerAdapter = viewPager.getAdapter();
      if (null == pagerAdapter) {
        return false;
      }

      final int currentItem = viewPager.getCurrentItem();
      return (direction < 0 && currentItem < pagerAdapter.getCount() - 1)
          || (direction > 0 && currentItem > 0);
    }

    @Override
    public boolean canScrollVertical(View v, int direction) {
      // TODO
      return false;
    }

  }

  private static class WebViewScrollDetector implements ScrollDetector {

    @Override
    public boolean canScrollHorizontal(View v, int direction) {
      try {
        // Because this method is protected
        Method computeHorizontalScrollOffsetMethod = WebView.class
            .getDeclaredMethod("computeHorizontalScrollOffset");
        Method computeHorizontalScrollRangeMethod = WebView.class
            .getDeclaredMethod("computeHorizontalScrollRange");
        computeHorizontalScrollOffsetMethod.setAccessible(true);
        computeHorizontalScrollRangeMethod.setAccessible(true);

        final int horizontalScrollOffset = (Integer) computeHorizontalScrollOffsetMethod
            .invoke(v);
        final int horizontalScrollRange = (Integer) computeHorizontalScrollRangeMethod
            .invoke(v);

        return (direction > 0 && v.getScrollX() > 0)
            || (direction < 0 && horizontalScrollOffset < horizontalScrollRange
                - v.getWidth());
      } catch (NoSuchMethodException e) {
        e.printStackTrace();
      } catch (IllegalArgumentException e) {
        e.printStackTrace();
      } catch (IllegalAccessException e) {
        e.printStackTrace();
      } catch (InvocationTargetException e) {
        e.printStackTrace();
      }
      return false;
    }

    @Override
    public boolean canScrollVertical(View v, int direction) {
      // TODO
      return false;
    }

  }

  private static class HorizontalScrollViewScrollDetector implements
      ScrollDetector {

    @Override
    public boolean canScrollHorizontal(View v, int direction) {
      HorizontalScrollView horizontalScrollView = (HorizontalScrollView) v;
      final int scrollX = horizontalScrollView.getScrollX();

      // Without scroll wrapper, can't scroll
      if (0 == horizontalScrollView.getChildCount()) {
        return false;
      }
      return (direction < 0 && scrollX < horizontalScrollView.getChildAt(
          0).getWidth()
          - horizontalScrollView.getWidth())
          || (direction > 0 && scrollX > 0);
    }

    @Override
    public boolean canScrollVertical(View v, int direction) {
      // TODO
      return false;
    }

  }

  /**
   * Factory for create new scroll detector
   * 
   * @param factory
   */
  public static void setScrollDetectorFactory(ScrollDetectorFactory factory) {
    mFactory = factory;
  }

  public interface ScrollDetector {
    public boolean canScrollHorizontal(View v, int direction);

    public boolean canScrollVertical(View v, int direction);
  }
}




Java Source Code List

com.morgan.library.app.APPContext.java
com.morgan.library.app.AppManager.java
com.morgan.library.app.BaseActivity.java
com.morgan.library.app.BaseFragmentActivity.java
com.morgan.library.app.BaseListActivity.java
com.morgan.library.app.BaseScreenShotActivity.java
com.morgan.library.app.CommonApplication.java
com.morgan.library.async.CustomAsyncTask.java
com.morgan.library.async.Destroyable.java
com.morgan.library.async.IFeedback.java
com.morgan.library.async.TaskManager.java
com.morgan.library.model.NetResult.java
com.morgan.library.model.SpinnerItem.java
com.morgan.library.model.WeatherType.java
com.morgan.library.model.Weather.java
com.morgan.library.net.ApiClient.java
com.morgan.library.net.ApiManager.java
com.morgan.library.net.ApiUrl.java
com.morgan.library.net.IApiClient.java
com.morgan.library.net.JsonUtils.java
com.morgan.library.net.MockApiClient.java
com.morgan.library.service.LocationManager.java
com.morgan.library.service.WeatherManager.java
com.morgan.library.snippet.CookieShare.java
com.morgan.library.snippet.CustomService.java
com.morgan.library.snippet.ExceptionCatcher.java
com.morgan.library.snippet.ProxyUsage.java
com.morgan.library.snippet.SocketClient.java
com.morgan.library.snippet.SocketServer.java
com.morgan.library.snippet.UDPClient.java
com.morgan.library.snippet.UDPServer.java
com.morgan.library.snippet.XMLAnalyze.java
com.morgan.library.task.GetWeatherTask.java
com.morgan.library.utils.AppUtils.java
com.morgan.library.utils.DateUtils.java
com.morgan.library.utils.DensityUtils.java
com.morgan.library.utils.FileUtils.java
com.morgan.library.utils.GB2Alpha.java
com.morgan.library.utils.HttpClientUtil.java
com.morgan.library.utils.HttpClientUtils.java
com.morgan.library.utils.HttpURLUtil.java
com.morgan.library.utils.ImageUtils.java
com.morgan.library.utils.KeyBoardUtils.java
com.morgan.library.utils.LocationUtils.java
com.morgan.library.utils.Logger.java
com.morgan.library.utils.NetUtils.java
com.morgan.library.utils.PhoneUtils.java
com.morgan.library.utils.SDCardUtils.java
com.morgan.library.utils.StrUtils.java
com.morgan.library.widget.AutoHideMenuWidget.java
com.morgan.library.widget.BadgeView.java
com.morgan.library.widget.CityPickerWidget.java
com.morgan.library.widget.CustomGridView.java
com.morgan.library.widget.CustomListView.java
com.morgan.library.widget.CustomToast.java
com.morgan.library.widget.CustomViewPager.java
com.morgan.library.widget.DatePickerWidget.java
com.morgan.library.widget.DirectionScrollView.java
com.morgan.library.widget.FallBallView.java
com.morgan.library.widget.HeightPickerWidget.java
com.morgan.library.widget.InterceptPressLayout.java
com.morgan.library.widget.ItalicTextView.java
com.morgan.library.widget.PopupMenuWidget.java
com.morgan.library.widget.PullToRefreshListView.java
com.morgan.library.widget.ScreenShotView.java
com.morgan.library.widget.SexPickerWidget.java
com.morgan.library.widget.SlideUpOpenWidget.java
com.morgan.library.widget.SwipeListView.java
com.morgan.library.widget.TimePickerWidget.java
com.morgan.library.widget.TouchZoomImageView.java
com.morgan.library.widget.WaitScreenWidget.java
com.morgan.library.widget.WebViewDialog.java
com.morgan.library.widget.WeightPickerWidget.java
com.morgan.library.widget.calendar.CalendarGridView.java
com.morgan.library.widget.calendar.CalendarScrollView.java
com.morgan.library.widget.calendar.CalendarViewFlipper.java
com.morgan.library.widget.calendar.CalendarWidget.java
com.morgan.library.widget.numberpicker.NumberPicker.java
com.morgan.library.widget.numberpicker.Scroller.java
com.morgan.library.widget.slidemenu.ScrollDetectorFactory.java
com.morgan.library.widget.slidemenu.ScrollDetectors.java
com.morgan.library.widget.slidemenu.SlideMenu.java