<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Android開發中,當一個頁面存放的控制元件超出螢幕時,通常需要使用ScrollView來包裹布局。這樣使用者可以通過手指的滑動來檢視超出螢幕的部分。然而當ScrollView滑動到邊界時,繼續滑動只會顯示一個陰影效果。iOS自帶的控制元件卻可以實現邊界的阻尼回彈效果,這種阻尼回彈效果會讓使用者有更好的使用體驗。這裡給出一個Android上的實現方案
ScrollView使用時要求內部有且僅一個子View。當ScrollView滑動到邊界時,讓子View在ScrollView中隨著手指按一定的規則進行平移,模擬出拉伸效果。當手指鬆開時,再讓子View恢復拉伸前的位置,模擬出回彈效果。
完整的程式碼如下,詳細的原理見註釋即可
public class StretchScrollView extends NestedScrollView { // 子View private View innerView; // 上次手勢事件的y座標 private float mLastY; // 記錄子View的正常位置 private Rect normal = new Rect(); public StretchScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { initView(); super.onFinishInflate(); } /** * 獲取ScrollView的子佈局 */ private void initView() { // 去除原本ScrollView捲動到邊界時的陰影效果 setOverScrollMode(OVER_SCROLL_NEVER); if (getChildAt(0) != null) { innerView = getChildAt(0); } } @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: // 手指鬆開恢復 if (!normal.isEmpty()) { planAnimation(); normal.setEmpty(); mLastY = 0; } break; case MotionEvent.ACTION_MOVE: float currentY = ev.getY(); // 滑動距離 int distanceY = (int) (mLastY - currentY); // 處理Y軸的捲動事件,當捲動到最上或者最下時需要移動佈局 // 手指剛觸及螢幕時,也會觸發此事件,此時mLastY的值還是0,會立即觸發一個比較大的移動。這裡過濾掉這種情況 if (isNeedTranslate() && mLastY != 0) { if (normal.isEmpty()) { // 儲存正常的佈局位置 normal.set(innerView.getLeft(), innerView.getTop(), innerView.getRight(), innerView.getBottom()); } // 移動佈局, 使distance / 2 防止平移過快 innerView.layout(innerView.getLeft(), innerView.getTop() - distanceY / 2, innerView.getRight(), innerView.getBottom() - distanceY / 2); } mLastY = currentY; break; } return super.onTouchEvent(ev); } /** * 回縮動畫 */ public void planAnimation() { // 開啟移動動畫 TranslateAnimation animation = new TranslateAnimation(0, 0, innerView.getTop(), normal.top); animation.setDuration(200); innerView.startAnimation(animation); // 補間動畫並不會真正修改innerView的位置,這裡需要設定使得innerView回到正常的佈局位置 innerView.layout(normal.left, normal.top, normal.right, normal.bottom); } /** * 是否需要Y移動佈局 */ public boolean isNeedTranslate() { int offset = innerView.getMeasuredHeight() - getHeight(); int scrollY = getScrollY(); // 頂部或者底部 return scrollY == 0 || scrollY == offset; } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45