1. 程式人生 > >ScrollView與其子控制元件事件衝突的解決,以及怎樣去禁止ScrollView的慣性滑動

ScrollView與其子控制元件事件衝突的解決,以及怎樣去禁止ScrollView的慣性滑動

Bug情景說明

需求是介面中展示一個條目列表,條目最上面是一張圖片,下拉後,圖片由模糊變清晰,最後我選用了用繼承ScrollView,以下是最終介面
這裡寫圖片描述

問題1:ScrollView與其子控制元件之間的觸控事件衝突的決絕

當我給下面的條目加點選事件後,在條目上面向下拖動ScrollView時,沒有效果,也就是說ScrollView的觸控事件被條目搶奪了:

問題1出現的原因

我們明顯可以看到,ScrollView沒有被填滿,而且下面還留出很大一塊部分。當我繼續用條目填充滿,超出ScrollView的可視範圍後,bug消失,剛開始我錯誤的認為,ScrollView的子控制元件如果不充滿它的可視範圍,它的觸控事件的處理優先順序比其他控制元件低。
所以,查資料和看ScrollView的原始碼,最後發現只要ScrollView所包裹的控制元件的高,大於了ScrollView的高,它就會去處理觸控事件

問題1的解決方法:

先看程式碼

   @Override
    protected void onFinishInflate() {
        if(getChildCount() > 0){
            child = getChildAt(0);
            setMiniHeight(child);
        }
    }

    private void setMiniHeight(View view) {
        if (mHandler == null) {
            return;
        }
        mHandler.postDelayed(new
Runnable() { @Override public void run() { // 設定子佈局最小高度是ScrollView的高度+2就可以動了 child.setMinimumHeight(getHeight() + 2); } }, 200); }
  • 首先在ScrollView的onFinishInflate()方法中獲取ScrollView的高和ScrollView所包裹的child(小知識點:ScrollView只能有一個child,所以直接通過ScrollView.getChildAt(0)即可獲取它的child)
  • 然後通過child的child.setMinimumHeight()方法設定child的高度(注意:這個高度不是真實的去設定給child的高,而是告訴ScrollView,它的child的高度)為ScrollView 的高度加2,因為通過我前面說的,只要ScrollView的子控制元件的高度,比它自己的高度大,它就會去優先處理觸控事件
    綜上所述,其實我們通過child的child.setMinimumHeight()就是騙ScrollView,告訴它,你的子控制元件的高度已經比你真實的高度大了,你需要滾動了。
    至此,問題1得到解決。

問題2:禁止ScrollView的慣性滑動

我們解決可上面的問題後,發現,ScrollView有個慣性滑動問題,它會在你宋開手後,繼續滑動一段距離,導致上面的圖片脫離上邊。
這個問題很容易解決,重寫ScrollView的fling()方法,然後在裡面不去呼叫它父類的fling()方法,不做任何處理,即可解決。

   @Override
    public void fling(int velocityY) {
        // super.fling(velocityY);   //  重寫此方法,在裡面什麼也不做,可以防止ScrollView慣性滑動
    }

相關推薦

ScrollView與其控制元件事件衝突解決以及怎樣禁止ScrollView慣性滑動

Bug情景說明 需求是介面中展示一個條目列表,條目最上面是一張圖片,下拉後,圖片由模糊變清晰,最後我選用了用繼承ScrollView,以下是最終介面 問題1:ScrollView與其子控制元件之間的觸控事件衝突的決絕 當我給下面的條目加點選事件後,在

手勢與控制元件事件衝突解決方案

在日常的開發中我們可能會遇到手勢與UI控制元件事件出現衝突造成監聽事件混亂的情況,其實解決方案非常簡單。在這裡我用點選手勢與UICollectionView的item點選事件作為案例對此方法做一下簡單的介紹。比如有如下案例: 圖中下邊綠色的為UIColle

禁止 ScrollView控制元件的佈局改變時自動滾動到最底部

在做專案的時候,遇到了一個問題,就是有下面那樣一個佈局: 某種情況下要動態改變 ViewPager 的高度,但是有時候再改變之後,整個頁面會自動滑動到最底部,而不是保持原有的位置。 解決方法: 重寫scrollview中的如下方法,並將其返回值設為0即可。 @Override

Gridview事件跟它item佈局中的控制元件事件衝突

Gridview的點選事件和每個item中控制元件的事件需要設定下事件優先順序 ,不然會造成事件衝突。 只需在item佈局的根佈局中加上android:descendantFocusability=”blocksDescendants”即可解決。 注:(用

android ListView的item與其控制元件的焦點問題

ListView預設情況 當item有焦點時,item上的button等子控制元件獲取不到焦點; 當子控制元件有焦點時,item無焦點無法響應onItemClick事件 ViewGroup.FOCUS_AFTER_DESCENDANTS:表示item的子控制元件優先於it

獲取ScrollView及其控制元件的滾動狀態

if ([scrollView.panGestureRecognizer velocityInView:scrollView].y > 0) {//上拉 NSLog(@"上拉")

事件分發 解決header控制元件與父控制元件衝突

父控制元件listview佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.

ListView中Item與Item的控制元件點選事件衝突問題解決

心靈包含人所有的一切有意識、無意識的思想、情感和行為。——《星夜心理書系》 1、問題 在Android開發時,ListView中點選一個Item,會一併觸發其子控制元件的點選事件。比如Item中的Button、ImageButton等。導致了點選

解決ListView中Item的控制元件(比如Button)與Item點選事件衝突

經常會碰到在ListView中點選其中一個Item,會一併觸發其子控制元件的點選事件,例如Item中的Button、ImageButton等,導致了點選Item中Button以外區域也會觸發Button點選事件。在網上找了相關方法,這裡記錄下,親測可行.. 1、在Item

iOS開發之在scrollview上新增點選並解決控制元件的點選無響應(如tableView)

- (void)addTap{ UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:s

IOS ScrollView 控制元件滑動手勢衝突

允許子檢視手勢延時響應 delaysContentTouches設 置為YES, CanCancelContentTouches設定為NO 以上設定了只是達到停頓0.5秒後,子控制元件可以手勢拖動

Android listview控制元件的的點選事件(轉)

1.先看圖,是否是你想要的   2.佈局檔案<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androi

Android : 事件分發,以及消除控制元件和父控制元件互相的影響

效果圖 消除在上下滑的時候讓下面的listview控制元件不進行滑動 如題,先上xml的程式碼 父控制元件listview <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.Con

scrollArea設定背景顏色不影響控制元件終於找到解決辦法(轉載)

使QScrollArea的背景透明,乍看很easy,其實卻是一個目前百度上百不出來的問題; 最容易想到的,用qss: scrollArea->setStyleSheet("background-color:transparent;"); 但是這樣會使scrol

unity 解析度自適應方法及ScrollView控制元件自適應問題

專案所需,unity需要自適應解析度,尤其需要適應全屏模式。 設定方法: 設定Canvas 屬性,如下圖 主要設定的屬性包括: Render Mode 設定為 Screen Space Canvase Scaler 的UI Scale Mode 為 Scale with Screen

事件分發,以及消除控制元件和父控制元件互相的影響

效果圖 消除在上下滑的時候讓下面的listview控制元件不進行滑動 如題,先上xml的程式碼 父控制元件listview <?xml version="1.0" encoding="utf-8"?> <android.support.

Android 當控制元件設定 focusable=true 的事件不能點選的問題

今天開發遇到一個問題,就是開發電視的時候,item佈局中子控制元件 設定了 focusable 。ListView設定OnItem後,觸控有效,點選也有效。但是遙控器的點選事件是無效的。 設定之前

控制元件搶佔父控制元件事件響應

1.在普通佈局中,父控制元件中含有button、ImageButton、CheckBox、EditText,RatingBar等時,點選事件失效。 例如:列表中的item佈局中含有RatingBar子控制元件。 在item的根佈局檔案中加入:android:

EditText監聽輸入完成和設定點選事件時與父控制元件衝突問題

最近在做專案時,發現一個問題,最後找到了解決辦法,特在此記錄一下,便於以後自己回憶以及和大家分享 問題描述:我在專案的頁面B放了一個線性佈局,裡面有EditText,本意是從A頁面跳轉到B頁面時,可能會先做別的操作,在修改EditText裡面的內容(闡述一下:

Android_關於控制元件和父控制元件事件響應問題

當父控制元件中有子控制元件的時候,並且父控制元件和子空間都有事件處理(比如單擊事件)。這時,點選子控制元件,父控制元件的單擊事件就無效了。如下圖: 比如一個LinearLayout裡面有一個子控制元件TextView,但是TextView的大小沒有LinearLayout大 ①如果LinearLayout和