356_实现头布局加ViewPager
来源:互联网 发布:赣州四中官网网络阅卷 编辑:程序博客网 时间:2024/05/16 20:28
实现头布局加ViewPager
阅读鸿洋大神博客笔记
博客地址:http://blog.csdn.net/lmj623565791/article/details/52204039
之前自己也写过头布局加下面页面切换而且带列表带上拉下拉刷新
但是下面的页面切换不是ViewPager而是直接显示隐藏头布局
鸿洋大神这个应该还不是特别完美,拉的时候有点卡顿
而且没有下拉刷新和上拉刷新
不知道怎么样可以实现这种布局的完美呈现
关键类:
public class StickyNavLayout extends LinearLayout implements NestedScrollingParent
{
private static final String TAG = "StickyNavLayout";
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes)
{
Log.e(TAG, "onStartNestedScroll");
return true;
}
@Override
public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes)
{
Log.e(TAG, "onNestedScrollAccepted");
}
@Override
public void onStopNestedScroll(View target)
{
Log.e(TAG, "onStopNestedScroll");
}
@Override
public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed)
{
Log.e(TAG, "onNestedScroll");
}
@Override
public void onNestedPreScroll(View target, int dx, int dy, int[] consumed)
{
Log.e(TAG, "onNestedPreScroll");
boolean hiddenTop = dy > 0 && getScrollY() < mTopViewHeight;
boolean showTop = dy < 0 && getScrollY() >= 0 && !ViewCompat.canScrollVertically(target, -1);
if (hiddenTop || showTop)
{
scrollBy(0, dy);
consumed[1] = dy;
}
}
@Override
public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed)
{
Log.e(TAG, "onNestedFling");
return false;
}
@Override
public boolean onNestedPreFling(View target, float velocityX, float velocityY)
{
Log.e(TAG, "onNestedPreFling");
//down - //up+
if (getScrollY() >= mTopViewHeight) return false;
fling((int) velocityY);
return true;
}
@Override
public int getNestedScrollAxes()
{
Log.e(TAG, "getNestedScrollAxes");
return 0;
}
private View mTop;
private View mNav;
private ViewPager mViewPager;
private int mTopViewHeight;
private OverScroller mScroller;
private VelocityTracker mVelocityTracker;
private int mTouchSlop;
private int mMaximumVelocity, mMinimumVelocity;
private float mLastY;
private boolean mDragging;
public StickyNavLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
setOrientation(LinearLayout.VERTICAL);
mScroller = new OverScroller(context);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
mMaximumVelocity = ViewConfiguration.get(context)
.getScaledMaximumFlingVelocity();
mMinimumVelocity = ViewConfiguration.get(context)
.getScaledMinimumFlingVelocity();
}
private void initVelocityTrackerIfNotExists()
{
if (mVelocityTracker == null)
{
mVelocityTracker = VelocityTracker.obtain();
}
}
private void recycleVelocityTracker()
{
if (mVelocityTracker != null)
{
mVelocityTracker.recycle();
mVelocityTracker = null;
}
}
// @Override
// public boolean onTouchEvent(MotionEvent event)
// {
// initVelocityTrackerIfNotExists();
// mVelocityTracker.addMovement(event);
// int action = event.getAction();
// float y = event.getY();
//
// switch (action)
// {
// case MotionEvent.ACTION_DOWN:
// if (!mScroller.isFinished())
// mScroller.abortAnimation();
// mLastY = y;
// return true;
// case MotionEvent.ACTION_MOVE:
// float dy = y - mLastY;
//
// if (!mDragging && Math.abs(dy) > mTouchSlop)
// {
// mDragging = true;
// }
// if (mDragging)
// {
// scrollBy(0, (int) -dy);
// }
//
// mLastY = y;
// break;
// case MotionEvent.ACTION_CANCEL:
// mDragging = false;
// recycleVelocityTracker();
// if (!mScroller.isFinished())
// {
// mScroller.abortAnimation();
// }
// break;
// case MotionEvent.ACTION_UP:
// mDragging = false;
// mVelocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
// int velocityY = (int) mVelocityTracker.getYVelocity();
// if (Math.abs(velocityY) > mMinimumVelocity)
// {
// fling(-velocityY);
// }
// recycleVelocityTracker();
// break;
// }
//
// return super.onTouchEvent(event);
// }
@Override
protected void onFinishInflate()
{
super.onFinishInflate();
mTop = findViewById(R.id.id_stickynavlayout_topview);
mNav = findViewById(R.id.id_stickynavlayout_indicator);
View view = findViewById(R.id.id_stickynavlayout_viewpager);
if (!(view instanceof ViewPager))
{
throw new RuntimeException(
"id_stickynavlayout_viewpager show used by ViewPager !");
}
mViewPager = (ViewPager) view;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
//不限制顶部的高度
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
getChildAt(0).measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
ViewGroup.LayoutParams params = mViewPager.getLayoutParams();
params.height = getMeasuredHeight() - mNav.getMeasuredHeight();
setMeasuredDimension(getMeasuredWidth(), mTop.getMeasuredHeight() + mNav.getMeasuredHeight() + mViewPager.getMeasuredHeight());
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
mTopViewHeight = mTop.getMeasuredHeight();
}
public void fling(int velocityY)
{
mScroller.fling(0, getScrollY(), 0, velocityY, 0, 0, 0, mTopViewHeight);
invalidate();
}
@Override
public void scrollTo(int x, int y)
{
if (y < 0)
{
y = 0;
}
if (y > mTopViewHeight)
{
y = mTopViewHeight;
}
if (y != getScrollY())
{
super.scrollTo(x, y);
}
}
@Override
public void computeScroll()
{
if (mScroller.computeScrollOffset())
{
scrollTo(0, mScroller.getCurrY());
invalidate();
}
}
}
0 0
- 356_实现头布局加ViewPager
- XListView加头布局ViewPager轮播
- 简单viewpager布局加fragment联动 可以实现效果
- TabLayout && ViewPager _布局文件
- ViewPager实现Tab布局
- fragment+viewpager实现布局
- XRecyclerView如此so easy实现下拉刷新,上拉加载,添加头布局(头布局任意加)
- # 融云 集成会话列表加头布局
- swiperefreshlayout 嵌套头布局为viewpager的listview 布局错乱
- Frament+viewpager实现滑动布局
- 【Android】ViewPager实现Tab布局
- TabLayout + ViewPager + Fragment 实现布局
- VIewPager+XListView+RadioButton实现布局
- 用Android Studio实现ViewPager加Fragment
- DrawerLayout侧栏 加ViewPager +子布局横栏+XlistView
- 在XlistView中插入ViewPager作为头布局
- Android_侧滑/横向滚动/XlistView上下/ViewPager-fragment/头布局/
- ListView加一个头布局–下拉刷新思路
- 为什么判断 std::vector 是否为空时,用 if(0==vec.size()) 提示效率低,但用 if (vec.empty()) 正常?
- Android四大基本组件介绍与生命周期
- Atitit 软件项目非法模块与功能的管理与 监狱管理的对比 原理与概论attilax总结
- 算法Week08.04 - LeetCode 46. Permutations
- 关于客户端断开连接后服务器抛出异常Connection reset
- 356_实现头布局加ViewPager
- bzoj 2208: [Jsoi2010]连通数 拓扑排序+强连通分量+bitset
- 第73篇 webrtc一对一(二)及php及JS
- ubuntu下SVN服务的安装与配置
- 错误笔记(保持更新)
- 锁屏和亮屏控制
- ApplicationContext
- 357_视频音量调控View
- <第五章>Node 学习笔记 |>HTTP知识填充<|