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