鼠标是慢慢拖动  如果分开的时候超过模拟器宽度的一半就 显示下一View 
如果不到一半就会弹回去 请问怎么实现 
或者说用什么控件 能实现

解决方案 »

  1.   

    鼠标是慢慢拖动 当鼠标放开的时候如果拖动的宽度超过模拟器宽度的一半就 显示下一View  
    如果不到一半就会弹回去  请问怎么实现  
    或者说用什么控件 能实现
     
      

  2.   

    launcher源码中的WorkSpace,其实就是onScroll等方法的使用,网上搜索很多资料。
      

  3.   

    package com.renrenwei.view;import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.VelocityTracker;
    import android.view.View;
    import android.view.ViewConfiguration;
    import android.view.ViewGroup;
    import android.widget.Scroller;public class ScrollLayout extends ViewGroup { private static final String TAG = "ScrollLayout";
    private Scroller mScroller;
    private VelocityTracker mVelocityTracker;
    private int mCurScreen;
    private int mDefaultScreen = 0;
    private static final int TOUCH_STATE_REST = 0;
    private static final int TOUCH_STATE_SCROLLING = 1;
    private static final int SNAP_VELOCITY = 600;
    private int mTouchState = TOUCH_STATE_REST;
    private int mTouchSlop;
    private float mLastMotionX;
    private float mLastMotionY; public ScrollLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
    } public ScrollLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mScroller = new Scroller(context);
    mCurScreen = mDefaultScreen;
    mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
    } @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
    if (changed) {
    int childLeft = 0;
    final int childCount = getChildCount();
    for (int i = 0; i < childCount; i++) {
    final View childView = getChildAt(i);
    if (childView.getVisibility() != View.GONE) {
    final int childWidth = childView.getMeasuredWidth();
    childView.layout(childLeft, 0, childLeft + childWidth,
    childView.getMeasuredHeight());
    childLeft += childWidth;
    }
    }
    }
    } @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    Log.e(TAG, "onMeasure");
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    final int width = MeasureSpec.getSize(widthMeasureSpec);
    final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    if (widthMode != MeasureSpec.EXACTLY) {
    throw new IllegalStateException(
    "ScrollLayout only canmCurScreen run at EXACTLY mode!");
    }
    final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    if (heightMode != MeasureSpec.EXACTLY) {
    throw new IllegalStateException(
    "ScrollLayout only can run at EXACTLY mode!");
    }
    final int count = getChildCount();
    for (int i = 0; i < count; i++) {
    getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec);
    }
    scrollTo(mCurScreen * width, 0);
    } public void snapToDestination() {
    final int screenWidth = getWidth();
    final int destScreen = (getScrollX() + screenWidth / 2) / screenWidth;
    snapToScreen(destScreen);
    } public void snapToScreen(int whichScreen) {
    whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
    if (getScrollX() != (whichScreen * getWidth())) {
    final int delta = whichScreen * getWidth() - getScrollX();
    mScroller.startScroll(getScrollX(), 0, delta, 0,
    Math.abs(delta) * 2);
    mCurScreen = whichScreen;
    invalidate(); // Redraw the layout
    }
    } public void setToScreen(int whichScreen) {
    whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
    mCurScreen = whichScreen;
    scrollTo(whichScreen * getWidth(), 0);
    } public int getCurScreen() {
    return mCurScreen;
    } @Override
    public void computeScroll() {
    if (mScroller.computeScrollOffset()) {
    scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    postInvalidate();
    }
    } @Override
    public boolean onTouchEvent(MotionEvent event) {
    if (mVelocityTracker == null) {
    mVelocityTracker = VelocityTracker.obtain();
    }
    mVelocityTracker.addMovement(event);
    final int action = event.getAction();
    final float x = event.getX();
    final float y = event.getY();
    switch (action) {
    case MotionEvent.ACTION_DOWN:
    Log.e(TAG, "event down!");
    if (!mScroller.isFinished()) {
    mScroller.abortAnimation();
    }
    mLastMotionX = x;
    break;
    case MotionEvent.ACTION_MOVE:
    int deltaX = (int) (mLastMotionX - x);
    mLastMotionX = x;
    scrollBy(deltaX, 0);
    break;
    case MotionEvent.ACTION_UP:
    Log.e(TAG, "event : up");
    final VelocityTracker velocityTracker = mVelocityTracker;
    velocityTracker.computeCurrentVelocity(1000);
    int velocityX = (int) velocityTracker.getXVelocity();
    Log.e(TAG, "velocityX:" + velocityX);
    if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
    // Fling enough to move left
    Log.e(TAG, "snap left");
    snapToScreen(mCurScreen - 1); } else if (velocityX < -SNAP_VELOCITY
    && mCurScreen < getChildCount() - 1) {
    // Fling enough to move right
    Log.e(TAG, "snap right");
    snapToScreen(mCurScreen + 1);
    } else {
    snapToDestination();
    }
    // if (velocityX > SNAP_VELOCITY && mCurScreen > 0) {
    //
    // // Fling enough to move left
    //
    // Log.e(TAG, "snap left");
    // if (mCurScreen > getChildCount() - 1) {
    // View v1 = getChildAt(0);
    // View v2 = getChildAt(1);
    // View v3 = getChildAt(2);
    //
    // }
    // snapToScreen(mCurScreen - 1);
    //
    // } else if (velocityX < -SNAP_VELOCITY
    //
    // && mCurScreen < getChildCount() - 1) {
    //
    // // Fling enough to move right
    //
    // Log.e(TAG, "snap right");
    //
    // snapToScreen(mCurScreen + 1);
    //
    // } else {
    //
    // snapToDestination();
    //
    // }
    //
    // if (mVelocityTracker != null) {
    //
    // mVelocityTracker.recycle();
    //
    // mVelocityTracker = null;
    //
    // }
    // }
    mTouchState = TOUCH_STATE_REST;
    break;
    case MotionEvent.ACTION_CANCEL:
    mTouchState = TOUCH_STATE_REST;
    break;
    }
    return true;
    } @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    Log.e(TAG, "onInterceptTouchEvent-slop:" + mTouchSlop + "; action = "
    + ev.getAction());
    final int action = ev.getAction();
    if ((action == MotionEvent.ACTION_MOVE)
    && (mTouchState != TOUCH_STATE_REST)) {
    Log.e(TAG, "onInterceptTouchEvent-action:" + action);
    return true;
    }
    final float x = ev.getX();
    final float y = ev.getY();
    switch (action) {
    case MotionEvent.ACTION_MOVE: final int xDiff = (int) Math.abs(mLastMotionX - x);
    Log.e(TAG, "onInterceptTouchEvent-move: xDiff = " + xDiff
    + "; mLastMotionX = " + mLastMotionX);
    if (xDiff > mTouchSlop) { mTouchState = TOUCH_STATE_SCROLLING;
    }
    break;
    case MotionEvent.ACTION_DOWN:
    mLastMotionX = x;
    mLastMotionY = y;
    Log.e(TAG, "onInterceptTouchEvent-down: x = " + x + "; y = " + y);
    mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST
    : TOUCH_STATE_SCROLLING;
    break;
    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
    Log.e(TAG, "onInterceptTouchEvent-up: mLastMotionX = "
    + mLastMotionX);
    mTouchState = TOUCH_STATE_REST;
    break;
    }
    return mTouchState != TOUCH_STATE_REST;
    }
    }<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/White"
        android:orientation="vertical" >    <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="300dip"
            android:orientation="vertical" >
        </LinearLayout>    <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginBottom="20dip"
            android:layout_marginLeft="15dip"
            android:layout_marginRight="15dip"
            android:background="@drawable/view_yuan_morelist" >        <com.renrenwei.view.ScrollLayout
                android:id="@+id/ScrollLayoutTest"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >            <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" >                <ImageView
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:src="@drawable/one" />
                </LinearLayout>            <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" >                <ImageView
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:src="@drawable/two" />
                </LinearLayout>            <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent" >                <ImageView
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:src="@drawable/three" />
                </LinearLayout>
            </com.renrenwei.view.ScrollLayout>
        </LinearLayout></LinearLayout>
      

  4.   

    利用viewGroup 重载computeScroller,onInterceptTouchEvent,onTouchEvent,然后可以根据你的需要选择scrollTo