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和