Android: HorizontalScrollView двигается как Iphone


Эта работа кода, как горизонтальной прокрутки на iPhone.

Второй код-библиотека ScrollView.

Лучшая идея, если у вас есть, прокомментируйте, пожалуйста.

Или Критики Приветствуются.

public class HorizontalScrollActivity extends Activity {
    private StickyHorizontalScrollView scrollView;
    private ArrayList<View> viewList = new ArrayList<View>();
    private ViewGroup mLayout;
    private ViewGroup mLayout2;
    private ViewGroup mLayout3;
    private LinearLayout mLayoutContainer;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        scrollView = new StickyHorizontalScrollView(this);
        scrollView.setHorizontalScrollBarEnabled(false);
        scrollView.setFadingEdgeLength(0);

        LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        DisplayMetrics mDisplayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
        int deviceWidth = mDisplayMetrics.widthPixels;
        int deviceHeight = mDisplayMetrics.heightPixels;

        mLayout = (ViewGroup)inflater.inflate(R.layout.main, null);
        mLayout.setLayoutParams(new LayoutParams(deviceWidth, deviceHeight));
        mLayout2 = (ViewGroup)inflater.inflate(R.layout.main2, null);
        mLayout2.setLayoutParams(new LayoutParams(deviceWidth, deviceHeight));
        mLayout3 = (ViewGroup)inflater.inflate(R.layout.main3, null);
        mLayoutContainer = (LinearLayout)mLayout3.findViewById(R.id.bodyLayout);
        mLayout3.removeView(mLayoutContainer);

        viewList.add(mLayout);
        viewList.add(mLayout2);

        int i = 0;
        for(View v : viewList){
            mLayoutContainer.addView(v);
            scrollView.addStickyPosition(i++ * deviceWidth);
        }
        scrollView.addView(mLayoutContainer);
        setContentView(scrollView);
    }
}

И этот код для библиотеки Iphonish HorizontalScrollView.

Страница Библиотеки

public class StickyHorizontalScrollView extends HorizontalScrollView {
    protected ArrayList<Integer> stickyPositions = new ArrayList<Integer>();
    private boolean flinged = false;
    private final String TAG = "StickyHorizontalScrollView ==========";

    public StickyHorizontalScrollView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void fling(int velocityX) {
        // TODO Auto-generated method stub
        Log.d(TAG, "FLING");
        flinged = true;

        int lastSmaller = 0;

        for(int sticky : stickyPositions){
            if(velocityX > 0 && sticky > getScrollX()){
                smoothScrollTo(sticky, getScrollY());
                break;
            }else if(velocityX < 0){
                if(sticky > getScrollX()){
                    smoothScrollTo(lastSmaller, getScrollY());
                    break;
                }else{
                    lastSmaller = sticky;
                }
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        // TODO Auto-generated method stub
        Log.d(TAG, "TOUCH");
        flinged = false;
        boolean res = super.onTouchEvent(ev);

        if(ev.getAction() == MotionEvent.ACTION_UP && !flinged){
            sanitizeScrollPosition();
        }
        return res;
    }

    public void sanitizeScrollPosition(){
        Log.d(TAG, "SANITIZE");
        Integer minDistance = 0;
        Integer minStickyPosition = 0;

        for(int sticky : stickyPositions){
            int distance = Math.abs(getScrollX() - sticky);
            if(minDistance == null || minDistance > distance){
                minStickyPosition = sticky;
                minDistance = distance;
            }
        }
        smoothScrollTo(minStickyPosition, getScrollY());
    }

    public void addStickyPosition(int x){
        Log.d(TAG, "ADD STICKY POSITION");
        stickyPositions.add(x);
        Collections.sort(stickyPositions);
    }

    public void clearStickyPositions(){
        Log.d(TAG, "CLEAR STICKY POSITION");
        stickyPositions.clear();
    }
}
2 2

2 ответа:

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

Https://github.com/ysamlan/horizontalpager

Надеюсь, что вы найдете его полезным, а также :)