您好,登錄后才能下訂單哦!
這篇文章主要介紹Android如何根據手勢實現頂部View自動展示與隱藏效果,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
首先來看一下效果:
大體思路如下:
總體布局用了一個自定義的ViewGroup,里面包了兩個View(top View,bottomView)
我在bottomView里放了ViewPager,里面又有Fragment,Fragment里放的是ListView
原理:
ViewGroup在分發touchEvent的時候先通過手勢GestureDetector判斷手勢方向,當向上滑動的時候讓topView和bottomView同時向上移動,反之亦然。
整體思路不是很難如下是干貨:
布局文件
<com.lin.gesturedetector.MyViewGroup android:id="@+id/view_group" android:layout_width="match_parent" android:layout_height="match_parent"> <include android:id="@+id/group_top" layout="@layout/view_top" /> <include android:id="@+id/group_bottom" layout="@layout/view_bottom" /> </com.lin.gesturedetector.MyViewGroup>
手勢監聽重要的是打log看一下上下滑動是數值的變化,找到其規律:
@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.i(tag, "onScroll -> distanceY" + distanceY); if (distanceY < 0) {// 手勢向下滑動是負值 animatorLayoutOffset(1); } if (distanceY > 0) { animatorLayoutOffset(0f); } return true; }
一定記得在ViewGroup內查找控件需要在onFinishInflate后才能找到:
@Override protected void onFinishInflate() { super.onFinishInflate(); viewTop = findViewById(R.id.group_top); viewBottom = findViewById(R.id.group_bottom); }
在ViewGroup布局的邏輯中需要處理的有一下幾點:
1、onMeasure的時候要把子控件測量出來
2、onLayout時需要手動將子控件布局
接下來就是監聽手勢設置動畫,不停的onLayout以達到topView和bottomView的布局效果
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); viewTop.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST)); viewBottom.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); setMeasuredDimension(width, height); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int topHeight = viewTop.getMeasuredHeight(); float offset = layoutOffset * topHeight; int width = r - l; float topViewYTop = offset - topHeight; float topViewYBottom = topViewYTop + topHeight; viewTop.layout(0, (int) topViewYTop, width, (int) topViewYBottom); viewBottom.layout(0, (int) topViewYBottom, width, (int) topViewYBottom + viewBottom.getMeasuredHeight()); } private void animatorLayoutOffset(float offset) { if (animator != null && animator.isRunning()) { return; } animator = ObjectAnimator.ofFloat(this, "layoutOffset", layoutOffset, offset); animator.setDuration(500); animator.start(); }
以上是“Android如何根據手勢實現頂部View自動展示與隱藏效果”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。