成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

wemall doraemon中Android app商城系統(tǒng)解決左側(cè)抽屜菜單和viewpager不

evin2016 / 1109人閱讀

完美解決左側(cè)抽屜菜單和viewpager不能兼容左右滑動(dòng)的問(wèn)題,可進(jìn)行參考。
WeMall-Client/res/layout/wemall_main_ui.xml






 No newline at end of file

WeMall-Client/src/cn/edu/zzu/wemall/ui/MainUIMain.java

import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.inputmethod.InputMethodManager;
@@ -105,6 +107,8 @@ public class MainUIMain extends FragmentActivity implements
menudata = new ArrayList>();
menuadapter = new MenuAdapter(this, menudata);
menulistview.setAdapter(menuadapter);
 
// 初始化ViewPager,菜單數(shù)據(jù)
InitViewPager();
@@ -206,8 +210,9 @@ public class MainUIMain extends FragmentActivity implements
public void onPageScrollStateChanged(int arg0) {
// 在這里判斷vpage是否滑到了商品頁(yè)面,如果滑到了商品頁(yè)面并且繼續(xù)向右拉動(dòng)屏幕,則展現(xiàn)菜單列表//
if (this.viewPager.getCurrentItem() == 0 && arg0 == 1) {
System.out.println("滑到了最左邊且在基于往右側(cè)滑動(dòng)");
 //slideMenu.openMenu();

} else {

}
}

**WeMall-Client/src/cn/edu/zzu/wemall/ui/SlideMenu.java
package cn.edu.zzu.wemall.ui;**

import cn.edu.zzu.wemall.R;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;

/*
 * 側(cè)邊欄類(lèi)
 * 
 */
public class SlideMenu extends ViewGroup {
    public static final int SCREEN_MENU = 0;
    public static final int SCREEN_MAIN = 1;
    private static final int SCREEN_INVALID = -1;

    private int mCurrentScreen;
    private int mNextScreen = SCREEN_INVALID;

    private Scroller mScroller;
    private VelocityTracker mVelocityTracker;
    private int mTouchSlop;

    private float mLastMotionX;
    private float mLastMotionY;

    private final static int TOUCH_STATE_REST = 0;
    private final static int TOUCH_STATE_SCROLLING = 1;
    private static final int SNAP_VELOCITY = 1000;

    public int mTouchState = TOUCH_STATE_REST;
    private boolean mLocked;
    private boolean mAllowLongPress;

    public SlideMenu(Context context) {
        this(context, null, 0);
    }

    public SlideMenu(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }


    public SlideMenu(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        mScroller = new Scroller(getContext());
        mCurrentScreen = SCREEN_MAIN;
        mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        measureViews(widthMeasureSpec, heightMeasureSpec);
    }

    public void measureViews(int widthMeasureSpec, int heightMeasureSpec) {
        View menuView = getChildAt(0);
        menuView.measure(menuView.getLayoutParams().width + menuView.getLeft()
                + menuView.getRight(), heightMeasureSpec);

        View contentView = getChildAt(1);
        contentView.measure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int childCount = getChildCount();
        if (childCount != 2) {
            throw new IllegalStateException(
                    "The childCount of SlidingMenu must be 2");
        }

        View menuView = getChildAt(0);
        final int width = menuView.getMeasuredWidth();
        menuView.layout(-width, 0, 0, menuView.getMeasuredHeight());

        View contentView = getChildAt(1);
        contentView.layout(0, 0, contentView.getMeasuredWidth(),
                contentView.getMeasuredHeight());
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        View child;
        for (int i = 0; i < getChildCount(); i++) {
            child = getChildAt(i);
            child.setFocusable(true);
            child.setClickable(true);
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (mLocked) {
            return true;
        }

        final int action = ev.getAction();
        if ((action == MotionEvent.ACTION_MOVE)
                && (mTouchState != TOUCH_STATE_REST)) {
            return true;
        }

        final float x = ev.getX();
        final float y = ev.getY();

        switch (action) {
        case MotionEvent.ACTION_MOVE:
            //在這里做點(diǎn)文章,側(cè)滑菜單和viewpager的滑動(dòng)兼容,頭疼。。。
            /**
             * 設(shè)定條件,如果當(dāng)前頁(yè)面在商品頁(yè)面,往右側(cè)拉動(dòng)屏幕,顯示菜單,往左則收回菜單,再往左拉
             * 則切換到購(gòu)物車(chē)
             * 如果當(dāng)前頁(yè)面在購(gòu)物車(chē)或者個(gè)人中心,則無(wú)論左右拉,都不理會(huì)菜單欄!,直接切換viewpager
             */
            ViewPager viewPager = (ViewPager) findViewById(R.id.vPager);
            if(viewPager.getCurrentItem()>0){ //如果當(dāng)前頁(yè)面不在商品頁(yè)面,則忽略滑動(dòng)出現(xiàn)菜單
                break;
            }

            final int xDiff = (int) Math.abs(x - mLastMotionX);
            final int yDiff = (int) Math.abs(y - mLastMotionY);
            //菜單沒(méi)顯示且往右滑動(dòng)時(shí)break
            if(isMainScreenShowing()&&(x - mLastMotionX)<0){
                break;
            }
            final int touchSlop = mTouchSlop;
            boolean xMoved = xDiff > touchSlop;
            boolean yMoved = yDiff > touchSlop;

            if (xMoved || yMoved) {

                if (xMoved) {
                    // Scroll if the user moved far enough along the X axis
                    mTouchState = TOUCH_STATE_SCROLLING;
                    enableChildrenCache();
                }
                // Either way, cancel any pending longpress
                if (mAllowLongPress) {
                    mAllowLongPress = false;
                    // Try canceling the long press. It could also have been
                    // scheduled
                    // by a distant descendant, so use the mAllowLongPress flag
                    // to block
                    // everything
                    final View currentScreen = getChildAt(mCurrentScreen);
                    currentScreen.cancelLongPress();
                }
            }
            break;

        case MotionEvent.ACTION_DOWN:
            
            // Remember location of down touch
            mLastMotionX = x;
            mLastMotionY = y;
            mAllowLongPress = true;
            mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST
                    : TOUCH_STATE_SCROLLING;
            break;

        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            // Release the drag
            clearChildrenCache();
            mTouchState = TOUCH_STATE_REST;
            mAllowLongPress = false;
            break;
        }

        /*
         * The only time we want to intercept motion events is if we are in the
         * drag mode.
         */
        return mTouchState != TOUCH_STATE_REST;
    }

    void enableChildrenCache() {
        final int count = getChildCount();
        for (int i = 0; i < count; i++) {
            final View layout = (View) getChildAt(i);
            layout.setDrawingCacheEnabled(true);
        }
    }

    void clearChildrenCache() {
        final int count = getChildCount();
        for (int i = 0; i < count; i++) {
            final View layout = (View) getChildAt(i);
            layout.setDrawingCacheEnabled(false);
        }
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (mLocked) {
            return true;
        }

        if (mVelocityTracker == null) {
            mVelocityTracker = VelocityTracker.obtain();
        }
        mVelocityTracker.addMovement(ev);

        final int action = ev.getAction();
        final float x = ev.getX();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            /*
             * If being flinged and user touches, stop the fling. isFinished
             * will be false if being flinged.
             */
            if (!mScroller.isFinished()) {
                mScroller.abortAnimation();
            }

            // Remember where the motion event started
            mLastMotionX = x;
            break;
        case MotionEvent.ACTION_MOVE:
            if (mTouchState == TOUCH_STATE_SCROLLING) {
                // Scroll to follow the motion event
                final int deltaX = (int) (mLastMotionX - x);
                mLastMotionX = x;
                if (deltaX < 0) {
                    if (deltaX + getScrollX() >= -getChildAt(0).getWidth()) {
                        scrollBy(deltaX, 0);
                    }

                } else if (deltaX > 0) {
                    
                    final int availableToScroll = getChildAt(
                            getChildCount() - 1).getRight()
                            - getScrollX() - getWidth();

                    if (availableToScroll > 0) {
                        scrollBy(Math.min(availableToScroll, deltaX), 0);
                    }
                }
            }
            break;
        case MotionEvent.ACTION_UP:
            if (mTouchState == TOUCH_STATE_SCROLLING) {
                final VelocityTracker velocityTracker = mVelocityTracker;
                velocityTracker.computeCurrentVelocity(1000);
                int velocityX = (int) velocityTracker.getXVelocity();

                if (velocityX > SNAP_VELOCITY && mCurrentScreen == SCREEN_MAIN) {
                    // Fling hard enough to move left
                    snapToScreen(SCREEN_MENU);
                } else if (velocityX < -SNAP_VELOCITY
                        && mCurrentScreen == SCREEN_MENU) {
                    // Fling hard enough to move right
                    snapToScreen(SCREEN_MAIN);
                } else {
                    snapToDestination();
                }

                if (mVelocityTracker != null) {
                    mVelocityTracker.recycle();
                    mVelocityTracker = null;
                }
            }
            mTouchState = TOUCH_STATE_REST;
            break;
        case MotionEvent.ACTION_CANCEL:
            mTouchState = TOUCH_STATE_REST;
        }

        return true;
    }

    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
        } else if (mNextScreen != SCREEN_INVALID) {
            mCurrentScreen = Math.max(0,
                    Math.min(mNextScreen, getChildCount() - 1));
            mNextScreen = SCREEN_INVALID;
            clearChildrenCache();
        }
    }

    @Override
    public void scrollTo(int x, int y) {
        super.scrollTo(x, y);
        postInvalidate();
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        final int scrollX = getScrollX();
        super.dispatchDraw(canvas);
        canvas.translate(scrollX, 0);
    }

    @Override
    public boolean dispatchUnhandledMove(View focused, int direction) {
        if (direction == View.FOCUS_LEFT) {
            if (getCurrentScreen() > 0) {
                snapToScreen(getCurrentScreen() - 1);
                return true;
            }
        } else if (direction == View.FOCUS_RIGHT) {
            if (getCurrentScreen() < getChildCount() - 1) {
                snapToScreen(getCurrentScreen() + 1);
                return true;
            }
        }
        return super.dispatchUnhandledMove(focused, direction);
    }

    protected void snapToScreen(int whichScreen) {

        enableChildrenCache();

        whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1));
        boolean changingScreens = whichScreen != mCurrentScreen;

        mNextScreen = whichScreen;

        View focusedChild = getFocusedChild();
        if (focusedChild != null && changingScreens
                && focusedChild == getChildAt(mCurrentScreen)) {
            focusedChild.clearFocus();
        }

        final int newX = (whichScreen - 1) * getChildAt(0).getWidth();
        final int delta = newX - getScrollX();
        mScroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
        invalidate();
    }

    protected void snapToDestination() {
        if (getScrollX() == 0) {
            return;
        }
        final int screenWidth = getChildAt(0).getWidth();
        final int whichScreen = (screenWidth + getScrollX() + (screenWidth / 2))
                / screenWidth;
        snapToScreen(whichScreen);
    }

    public int getCurrentScreen() {
        return mCurrentScreen;
    }

    public boolean isMainScreenShowing() {
        return mCurrentScreen == SCREEN_MAIN;
    }

    public void openMenu() {
        mCurrentScreen = SCREEN_MENU;
        snapToScreen(mCurrentScreen);
    }

    public void closeMenu() {
        mCurrentScreen = SCREEN_MAIN;
        snapToScreen(mCurrentScreen);
    }

    public void unlock() {
        mLocked = false;
    }

    public void lock() {
        mLocked = true;
    }

}

原文詳情地址:http://git.oschina.net/zzunet...
wemall doraemonAndroid app商城詳情地址:http://www.koahub.com/home/pr...
wemall官網(wǎng)地址:http://www.wemallshop.com

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65277.html

相關(guān)文章

  • Fragment監(jiān)聽(tīng)onKey事件

    摘要:本文分享開(kāi)發(fā)中監(jiān)聽(tīng)事件主要代碼,供技術(shù)員參考學(xué)習(xí)。項(xiàng)目中越來(lái)越多的用到,下面記錄一下在中監(jiān)聽(tīng)的事件。實(shí)現(xiàn)事件,判斷當(dāng)前的是哪一個(gè),是不是所需要的然后在需要監(jiān)聽(tīng)事件的中寫(xiě)一個(gè)靜態(tài)方法,傳遞與事件即可。 wemall-mobile是基于WeMall的android app商城,只需要在原商城目錄下上傳接口文件即可完成服務(wù)端的配置,客戶端可定制修改。本文分享android開(kāi)發(fā)Fragment...

    Berwin 評(píng)論0 收藏0
  • Fragment監(jiān)聽(tīng)onKey事件

    摘要:本文分享開(kāi)發(fā)中監(jiān)聽(tīng)事件主要代碼,供技術(shù)員參考學(xué)習(xí)。項(xiàng)目中越來(lái)越多的用到,下面記錄一下在中監(jiān)聽(tīng)的事件。實(shí)現(xiàn)事件,判斷當(dāng)前的是哪一個(gè),是不是所需要的然后在需要監(jiān)聽(tīng)事件的中寫(xiě)一個(gè)靜態(tài)方法,傳遞與事件即可。 wemall-mobile是基于WeMall的android app商城,只需要在原商城目錄下上傳接口文件即可完成服務(wù)端的配置,客戶端可定制修改。本文分享android開(kāi)發(fā)Fragment...

    cpupro 評(píng)論0 收藏0
  • wemall app商城源碼Android短信監(jiān)聽(tīng)接收器

    摘要:是客戶端程序,服務(wù)端采用微信商城,不對(duì)原商城做任何修改,只需要在原商城目錄下上傳接口文件即可完成服務(wù)端的配置,客戶端可隨阿意定制修改。本文分享其中短信監(jiān)聽(tīng)接收器,用于自動(dòng)獲取短信驗(yàn)證碼,然后自動(dòng)填寫(xiě)到驗(yàn)證碼區(qū)域代碼,供技術(shù)員參考學(xué)習(xí)。 wemall doraemon是Android客戶端程序,服務(wù)端采用wemall微信商城,不對(duì)原商城做任何修改,只需要在原商城目錄下上傳接口文件即可完成...

    aervon 評(píng)論0 收藏0
  • wemall app商城系統(tǒng)Android之支付寶接口RSA函數(shù)

    摘要:本文分享支付寶接口函數(shù)簽名驗(yàn)簽解密等,供技術(shù)員參考學(xué)習(xí)。以下代碼只是為了方便商戶測(cè)試而提供的樣例代碼,商戶可以根據(jù)自己網(wǎng)站的需要,按照技術(shù)文檔編寫(xiě)并非一定要使用該代碼,該代碼僅供學(xué)習(xí)和研究支付寶接口使用,只是提供一個(gè)參考。 wemall-mobile是基于WeMall的Android app商城,只需要在原商城目錄下上傳接口文件即可完成服務(wù)端的配置,客戶端可定制修改。本文分享支付寶接口...

    NusterCache 評(píng)論0 收藏0
  • wemall app商城系統(tǒng)Android之支付寶接口RSA函數(shù)

    摘要:本文分享支付寶接口函數(shù)簽名驗(yàn)簽解密等,供技術(shù)員參考學(xué)習(xí)。以下代碼只是為了方便商戶測(cè)試而提供的樣例代碼,商戶可以根據(jù)自己網(wǎng)站的需要,按照技術(shù)文檔編寫(xiě)并非一定要使用該代碼,該代碼僅供學(xué)習(xí)和研究支付寶接口使用,只是提供一個(gè)參考。 wemall-mobile是基于WeMall的Android app商城,只需要在原商城目錄下上傳接口文件即可完成服務(wù)端的配置,客戶端可定制修改。本文分享支付寶接口...

    hiyang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<