android一个向上滑动显示菜单,向下滑动隐藏菜单实现
来源:互联网 发布:linux mv多个文件 编辑:程序博客网 时间:2024/06/06 00:33
最近发现浏览器qq猎豹等,很多都是,向上滑动显示搜索菜单,向下浏览网页隐藏搜索菜单,而且非常平滑的效果,用Visistty.setVisisty(View....)一直达到我想要的效果。用改变view的位置,平移到屏幕显示外面。并且带有动画效果来实现。貌似会更好点。直接看代码。一部分代码仿另一个开源项目基础上修改而来的。
主要原理是检查判定是否在滑动到屏幕的顶部或者底部,根据其顶部的话就,让我们的内容view 偏移顶部高度为我们topview高度,否则view偏移量为0。并为其设置平移动画效果。
主要原理是检查判定是否在滑动到屏幕的顶部或者底部,根据其顶部的话就,让我们的内容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);
}
}
});
}
}
0 0
- android一个向上滑动显示菜单,向下滑动隐藏菜单实现
- jquery菜单滑动及显示隐藏效果
- jquery - 左边栏菜单滑动隐藏/显示
- 菜单UI点击隐藏与显示(滑动)
- android 滑动菜单SlidingMenu实现
- Android滑动菜单特效实现
- Android滑动菜单特效实现
- Android 滑动菜单的实现
- Android 滑动菜单的实现
- Android滑动菜单特效实现
- Android滑动菜单特效实现
- Android滑动菜单框架一分钟实现滑动菜单特效
- JS滑动菜单显示
- JS滑动菜单显示
- 页面向下滑动实现div显示和隐藏
- 实现左侧滑动菜单
- 滑动菜单特效实现
- 底部滑动菜单实现
- Largest Rectangle in Histogram
- 再议访问者模式 - Visitor vs Acyclic Visitor
- css一些简写优化技巧
- 人生之道
- PyQT——禁止显示窗口最大化按钮及禁止调整窗口大小
- android一个向上滑动显示菜单,向下滑动隐藏菜单实现
- 让小屏幕kindlePaperWhite2支持PDF (二)
- 通过HTML5 Visibility API检测页面活动状态
- Mysql学习-(4-创建数据表)
- Oracle数据文件结构
- Jquery easyUi 删除多行
- 使用jquery访问页面中iframe中的内容
- Introducing Gupt: A Backdoor which uses Wireless network names for command execution
- error while loading shared libraries: xxx.so.x"错误的原因和解决办法