android 關于自定義View在特殊情況下觸發setPressed方法(View源碼解析)

文章目錄

  • 前言
  • 一、為什么樣式會變?
  • 二、調試發現原因并解決
    • 1.找到原因
    • 2.解決
  • 總結


前言

最近在負責一些UI相關的工作,測試給到一個UI的bug,說是搜索框在點擊的時候,旁邊的’‘X’'變成按壓的效果了,我轉手就把bug轉給負責公控的同事了,因為這個搜索框是公控同事提供的,但是公控大佬不一會就找到我說,我這里都是好的鴨,是不是你哪里沒用對,我直接就暈乎了,我左看右看也沒干啥鴨,于是開始對線,巴拉巴拉…但是問題還是沒有解決,于是有了這篇文章.


一、為什么樣式會變?

首先公控大佬給我講了他是怎么做X的按壓效果的,就是說監聽了搜索框的onTouchEvent事件,然后當onTouchEvent傳入的rect包含了X的時候,將其設置為點按效果,其他時候是不會對這個X控件的樣式進行改變的,沒辦法,我只好將公控同事的源碼要來,加上日志調試.

二、調試發現原因并解決

1.找到原因

加了日志發現代碼并沒有走到公控同事的代碼邏輯當中,但是進入onTouchEvent事件時,X控件的樣式已經變成點按狀態了,而公控同事的demo項目,X控件的樣式確實并沒有改變,鑒定為G.最后監聽setPressed的時候發現在點擊控件時,會觸發 setPressed = true 事件,隨后分析VIEW 源碼,定位到如下代碼位置:

				case MotionEvent.ACTION_DOWN:.....這里忽略部分代碼// Walk up the hierarchy to determine if we're inside a scrolling container.boolean isInScrollingContainer = isInScrollingContainer();// For views inside a scrolling container, delay the pressed feedback for// a short period in case this is a scroll.if (isInScrollingContainer) {mPrivateFlags |= PFLAG_PREPRESSED;if (mPendingCheckForTap == null) {mPendingCheckForTap = new CheckForTap();}mPendingCheckForTap.x = event.getX();mPendingCheckForTap.y = event.getY();postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());} else {// Not inside a scrolling container, so show the feedback right away setPressed(true, x, y);checkForLongClick(ViewConfiguration.getLongPressTimeout(),x,y,TOUCH_GESTURE_CLASSIFIED__CLASSIFICATION__LONG_PRESS);}break;

在View.java的源碼當中的onTouchEvent方法的MotionEvent.ACTION_DOWN事件,有一個 isInScrollingContainer的醒目判斷,并加上了注釋,我們繼續看下isInScrollingContainer方法

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)public boolean isInScrollingContainer() {ViewParent p = getParent();while (p != null && p instanceof ViewGroup) {if (((ViewGroup) p).shouldDelayChildPressedState()) {return true;}p = p.getParent();}return false;}

可以看到會判斷一個shouldDelayChildPressedState方法,然后返回true,到這里基本可以確定這就是我和公控同事觸發的不一致的地方,這是一個ViewGroup的方法,點進去過后注釋是這樣寫的:

Return true if the pressed state should be delayed for children or
descendants of this ViewGroup. Generally, this should be done for
containers that can scroll, such as a List. This prevents the pressed
state from appearing when the user is actually trying to scroll the
content. The default implementation returns true for compatibility
reasons. Subclasses that do not scroll should generally override this
method and return false.

我們機翻一下:如果應延遲此ViewGroup的子代或子代的按下狀態,則返回true。通常,這應該針對可以滾動的容器(如List)進行。這防止了當用戶實際試圖滾動內容時出現按下狀態。由于兼容性原因,默認實現返回true。不滾動的子類通常應該覆蓋此方法并返回false。

2.解決

到了上面這里,我們基本可以明白,這是因為我們搜索框公控的父布局使用的可滑動的控件,導致進入isInScrollingContainer返回true,并觸發了setPressed方法,然后改變了控件的樣式 為點按狀態,針對這個問題,我們有這幾種方式可以解決.

  1. 重寫公控的這個控件的setPressed方法,每次都返回false
  2. 重寫父布局的shouldDelayChildPressedState方法,使其返回false
  3. 更改公控代碼對 這種特殊情況做兼容
    前面兩種方法改的快,但是不能確保不出其它問題,因此這個問題最后還是由公控大佬對這種情況做兼容,over

總結

通過調試和分析源碼,我們找到了問題的原因和解決方法。問題是因為在可滑動的父布局中,觸發了setPressed方法,導致控件樣式變為點按狀態。解決方法有重寫setPressed方法、重寫shouldDelayChildPressedState方法或者對公控代碼做兼容處理。選擇合適的解決方法,能夠解決這個UI bug。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17825.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql常用操作DDL數據庫、表操作:

SQl DDl-數據庫操作 查詢 查詢所有數據庫 show databases; 查詢當前數據庫 select database(); 創建 create database [if not exists] 數據庫名 [default charset 字符集] [collate 排序規則]; 刪除 drop database[if exists] 數據庫名; 使用 use 數據庫名;…

K8s集群中的Pod調度約束親和性與反親和性

前言 在 K8s 集群管理中,Pod 的調度約束——親和性(Affinity)與反親和性(Anti-Affinity)這兩種機制允許管理員精細控制 Pod 在集群內的分布方式,以適應多樣化的業務需求和運維策略。本篇將介紹 K8s 集群中…

運維開發詳解:現代IT環境的核心角色

隨著信息技術的快速發展和互聯網應用的廣泛普及,運維開發(DevOps)在現代IT環境中扮演著越來越重要的角色。本文將詳細探討運維開發的概念、歷史背景、關鍵實踐、工具和未來趨勢,旨在為讀者提供全面的理解。 什么是運維開發&#…

labview類編程

1.父類的功能是通用功能,所有子類都含有父類的功能,重寫會自動執行一次父類的功能。 2.每個子類都用了父類的注冊vi,所以在調用的時候,出來的就是子類注冊的vi,也就是window.vi。 3.假如要設計一個父類的vi,首先是保存…

手持高速暴力風扇方案32位單片機

RAMSUN一款低成本的暴力無刷風扇方案,集成無刷電機驅動、電池低壓保護等功能的同時,保持較低的待機功耗。 手持高速暴力風扇主控芯片MM32SPIN080C高性能的單電機控制 SOC 產品,集成了運動控制所需的專用模擬外設。包括 12 位高精度 ADC、2 路模擬比較器…

Mac 系統 clion 使用 getline 無法讀取文件內容

不知道是 mac 的問題還是 clion 的問題&#xff0c;如下面代碼 #include <iostream> #include <fstream>using namespace std;int main() {string file_name "1.txt";std::ifstream file(file_name);if (file.is_open()) {std::string line;while (std…

airtest做web端UI自動化實戰

安裝 官網下載客戶端 airtest庫安裝 pip install airtest pip install pocoui腳本錄制 利用airtest客戶端錄制腳本 web端輔助插件-selenium windows打開: 設置chrome路徑 開始調式錄制 腳本運行 # -*- coding: utf-8 -*- """ Time &#xff1a; 2024/5/…

龍迅LT86102UXE HDMI 2.0分配兩個HDMI 2.0輸出,支持標準4K60HZ,內置MCU供電可自動操作

龍迅LT86102UXE描述&#xff1a; Lontium LT86102UXE HDMI2.0分配器具有1&#xff1a;2的分配器&#xff0c;符合HDMI2.0/1.4規范&#xff0c;最大6Gbps高速數據速率&#xff0c;自適應均衡RX輸入和預先強調的TX輸出&#xff0c;以支持長電纜應用程序&#xff0c;內部TX通道交…

前端開發——煉金術師的畫布:JavaScript在圖像處理領域的魔法手冊【含代碼示例】

煉金術師的畫布&#xff1a;JavaScript在圖像處理領域的魔法手冊【含代碼示例】 前言&#xff1a;圖像處理的魔法基礎基本概念&#xff1a;像素的舞蹈Canvas API&#xff1a;前端的畫板 圖像處理的咒語&#xff1a;基礎操作加載與繪制圖像魔法變形&#xff1a;圖像裁剪色彩魔法…

用大模型搭建一個自己的新聞小助手

背景 信息快速增長的時代&#xff0c;及時獲取到有價值的資訊是一件很必要的事情。已經有各類新聞app和獲取信息的渠道了&#xff0c;為什么還需要在構建一個小助手來獲取新聞資訊呢&#xff1f;其實原因很簡單各類新聞app服務的是具體一類人群&#xff0c;個人和人群還是有偏…

kafka-消費者組-發布訂閱測試

文章目錄 1、發布訂閱測試1.1、創建消費者4并指定組 my_group21.2、列出所有的消費者組1.3、查看 my_group2 組的詳細信息1.4、發送第六條消息accomplish1.4.1、查看 my_group1 組的詳細信息1.4.2、查看 my_group2 組的詳細信息 1、發布訂閱測試 接著上一篇點對點博客測試 kafk…

LabVIEW控制Trio控制器

將LabVIEW與Trio控制器結合&#xff0c;可以實現對復雜運動系統的控制和監測。以下是詳細的方法和注意事項&#xff1a; 一、準備工作 軟件安裝&#xff1a; 安裝LabVIEW開發環境&#xff0c;確保版本兼容性。 安裝Trio控制器的相關驅動程序和軟件&#xff0c;如Trio Motion …

出現 Transaction rolled back because it has been marked as rollback-only 解決方法

目錄 1. 問題所示2. 原理分析3. 解決方法1. 問題所示 用戶反饋的Bug如下所示: Transaction rolled back because it has been marked as rollback-only截圖如下: 瀏覽器終端同樣顯示: 2. 原理分析 錯誤表明,在事務的生命周期內,遇到了某個異常或條件,導致該事務被標記…

Shell編程中的循環語句和函數

一、for循環語句 當面對各種列表重復任務時&#xff0c;使用簡單的if語句已經難以滿足需求&#xff0c;這時就需要for循環語句。for語句的結構為&#xff1a; for 變量 in 取值列表 do 命令序列 done 使用for循環語句時&#xff0c;需要指定一個變量及取值列表&#xff0c;針對…

2、python環境的安裝-mac系統下

打開官網&#xff0c;downloads下邊有macOS&#xff0c;點擊&#xff1a; 選擇最新版本&#xff0c;點擊&#xff0c;進入下邊的頁面&#xff0c;一直往下滑&#xff0c;看到files中有個macOS的版本&#xff0c;點擊下載 點擊下載后是pkg的安裝包&#xff0c;點擊安裝。 一步步…

鴻蒙OS開發:【一次開發,多端部署】(app市場首頁)項目

一多應用市場首頁 介紹 本示例展示了應用市場首頁&#xff0c;頁面中包括Tab欄、運營橫幅、精品應用、精品游戲等。 本示例使用一次開發多端部署中介紹的自適應布局能力和響應式布局能力進行多設備&#xff08;或多窗口尺寸&#xff09;適配&#xff0c;保證應用在不同設備或…

藍橋杯第1022題 玩具蛇 基礎DFS C++ Java

題目 思路和解題方法 問題理解&#xff1a;此題要求找出將一條由16節正方形構成的玩具蛇放入4x4的方格中的不同方式數。每節蛇可以是直線或直角轉彎&#xff0c;且蛇的形狀需要完全覆蓋盒子里的16個格子&#xff0c;每個格子僅被蛇的一個部分占據。 狀態表示&#xff1a;使用一…

爺爺看了都會,打工人必備的摸魚AI神器!免費!

去年&#xff0c;AI技術無疑成為了最為引人注目的焦點&#xff0c;層出不窮的創新應用令人目不暇接。盡管許多人對這股AI熱潮的持久性持懷疑態度&#xff0c;但現實卻用事實給予了最有力的反駁。AI所展現出的強大生產力&#xff0c;足以令人刮目相看。 而今年以來&#xff0c;…

springboot鏈接kafka異步發送消息

<dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency> spring:kafka:bootstrap-servers:- ip:端口producer:retries: 0acks: 1batch-size: 16384properties:linger:ms: 100buff…

centos 記錄用戶登陸ip和執行命令

centos 記錄用戶登陸ip和執行命令 在/etc/profile 文件末尾添加如下代碼&#xff1a; #!/bin/bash USER_IPwho -u am i 2>/dev/null | awk {print $NF} | sed -e s/[()]//g HISTDIR/usr/share/.history if [ -z "$USER_IP" ]; then USER_IPhostname fi…