android一個向上滑動顯示菜單,向下滑動隱藏菜單實現

jopen 9年前發布 | 8K 次閱讀 Java Android

瀏覽器qq獵豹等,很多都是,向上滑動顯示搜索菜單,向下瀏覽網頁隱藏搜索菜單,而且非常平滑的效果,用Visistty.setVisisty(View....)一直達到我想要的效果。用改變view的位置,平移到屏幕顯示外面。并且帶有動畫效果來實現。貌似會更好點。直接看代碼。一部分代碼仿另一個開源項目基礎上修改而來的。

 
主要原理是檢查判定是否在滑動到屏幕的頂部或者底部,根據其頂部的話就,讓我們的內容view 偏移頂部高度為我們topview高度,否則view偏移量為0。并為其設置平移動畫效果。

public class ScrollViewActivity extends Activity {
    private PoppyViewHelper mPoppyViewHelper;
    private LayoutInflater layoutInflater;
    private NotifyingScrollView scrollView;
    private View poppyview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scrollview);
        layoutInflater=LayoutInflater.from(this);
        scrollView=(NotifyingScrollView)findViewById(R.id.scrollView);
        poppyview=layoutInflater.inflate(R.layout.poppyview, null);

    mPoppyViewHelper = new PoppyViewHelper(this, PoppyViewPosition.TOP);
    ViewGroup poppyView = mPoppyViewHelper.createPoppyViewOnScrollView(scrollView, poppyview);

    poppyView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(ScrollViewActivity.this, "Click me!", Toast.LENGTH_SHORT).show();
        }
    });
}

}

public class PoppyViewHelper { public enum PoppyViewPosition { TOP, BOTTOM }; private static final int SCROLL_TO_TOP = - 1; private static final int SCROLL_TO_BOTTOM = 1; private static final int SCROLL_DIRECTION_CHANGE_THRESHOLD = 5; private Activity mActivity; private LayoutInflater mLayoutInflater; private View mPoppyView; private int mScrollDirection = 0; private int mPoppyViewHeight = - 1;

private PoppyViewPosition mPoppyViewPosition;
public PoppyViewHelper(Activity activity, PoppyViewPosition position) {
    mActivity = activity;
    mLayoutInflater = LayoutInflater.from(activity);
    mPoppyViewPosition = position;
}
public PoppyViewHelper(Activity activity) {
    this(activity, PoppyViewPosition.BOTTOM);
}

private ViewGroup viewGroup;
// for scrollview
private  NotifyingScrollView scrollView;
public ViewGroup createPoppyViewOnScrollView(NotifyingScrollView scrollViewId, View poppyViewResId) {
     mPoppyView =poppyViewResId;
     scrollView = scrollViewId;
    initPoppyViewOnScrollView();
    return viewGroup;
}
// for ListView
public View createPoppyViewOnListView(int listViewId, int poppyViewResId, OnScrollListener onScrollListener) {
    final ListView listView = (ListView)mActivity.findViewById(listViewId);
    if(listView.getHeaderViewsCount() != 0) {
        throw new IllegalArgumentException("use createPoppyViewOnListView with headerResId parameter");
    }
    if(listView.getFooterViewsCount() != 0) {
        throw new IllegalArgumentException("poppyview library doesn't support listview with footer");
    }
    mPoppyView = mLayoutInflater.inflate(poppyViewResId, null);
    initPoppyViewOnListView(listView, onScrollListener);
    return mPoppyView;
}
public View createPoppyViewOnListView(int listViewId, int poppyViewResId) {
    return createPoppyViewOnListView(listViewId, poppyViewResId, null);
}
// common
private void setPoppyViewOnView(View view) {
    LayoutParams lp = view.getLayoutParams();
    ViewParent parent = view.getParent();
    ViewGroup group = (ViewGroup)parent;
    int index = group.indexOfChild(view);
    final FrameLayout newContainer = new FrameLayout(mActivity);
    group.removeView(view);
    group.addView(newContainer, index, lp);
    newContainer.addView(view);
    final FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    layoutParams.gravity = mPoppyViewPosition == PoppyViewPosition.BOTTOM ? Gravity.BOTTOM : Gravity.TOP;
    newContainer.addView(mPoppyView, layoutParams);
    group.invalidate();
    viewGroup=group;
}
private boolean isjixu=false;
private void onScrollPositionChanged(int oldScrollPosition, int newScrollPosition) {
    int newScrollDirection;
    System.out.println(oldScrollPosition + " ->" + newScrollPosition);
    if(newScrollPosition < oldScrollPosition) {
        newScrollDirection = SCROLL_TO_TOP;
        isjixu=true;
        //gundong滾動dao到dingb頂部
    } else {
        newScrollDirection = SCROLL_TO_BOTTOM;
        isjixu=false;
    }
    if(newScrollDirection != mScrollDirection) {
        mScrollDirection = newScrollDirection;
        translateYPoppyView();
    }
}
private     int translationY = 0;
private boolean isdingbu=false;
private void translateYPoppyView() {

    mPoppyView.post(new Runnable() {
        @Override
        public void run() {
            if(mPoppyViewHeight <= 0) {
                mPoppyViewHeight = mPoppyView.getHeight();
            }


            switch (mPoppyViewPosition) {
            case BOTTOM:
                translationY = mScrollDirection == SCROLL_TO_TOP ? 0 : mPoppyViewHeight;

                break;
            case TOP:
                translationY = mScrollDirection == SCROLL_TO_TOP ?  0:  -mPoppyViewHeight;
                isdingbu=true;
                break;
            }
            ViewPropertyAnimator.animate(mPoppyView).setDuration(300).translationY(translationY);
        }
    });
    if(isdingbu){
        scrollView.post(new Runnable() {
            @Override
            public void run() {
                如果為頂部顯示就讓view平移Mpoppyviewhiegh高度
                ViewPropertyAnimator.animate(scrollView).setDuration(300).translationY(mPoppyViewHeight);
                isdingbu=false;
            }
        });

    }else{
        scrollView.post(new Runnable() {
            @Override
            public void run() {
                不然就讓他顯示在屏幕頂部
                ViewPropertyAnimator.animate(scrollView).setDuration(300).translationY(0);
            }
        });

    }

}
// for ScrollView
private void initPoppyViewOnScrollView() {
    setPoppyViewOnView(scrollView);
    scrollView.setOnScrollChangedListener(new NotifyingScrollView.OnScrollChangedListener() {
        int mScrollPosition;
        public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {
            if(Math.abs(t - mScrollPosition) >= SCROLL_DIRECTION_CHANGE_THRESHOLD) {
                onScrollPositionChanged(mScrollPosition, t);
            }

            mScrollPosition = t;
        }
    });
}
// for ListView
private void initPoppyViewOnListView(ListView listView, final OnScrollListener onScrollListener) {
    setPoppyViewOnView(listView);
    listView.setOnScrollListener(new OnScrollListener() {
        int mScrollPosition;
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if(onScrollListener != null) {
                onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
            }
            View topChild = view.getChildAt(0);
            int newScrollPosition = 0;
            if(topChild == null) {
                newScrollPosition = 0;
            } else {
                newScrollPosition = - topChild.getTop() + view.getFirstVisiblePosition() * topChild.getHeight();
            }
            if(Math.abs(newScrollPosition - mScrollPosition) >= SCROLL_DIRECTION_CHANGE_THRESHOLD) {
                onScrollPositionChanged(mScrollPosition, newScrollPosition);
            }
            mScrollPosition = newScrollPosition;
        }
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            if(onScrollListener != null) {
                onScrollListener.onScrollStateChanged(view, scrollState);
            }
        }
    });
}

} </pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!