【Android】View 的基礎知識

【Android】View 的基礎知識

1. 什么是 View?

View 是 Android 中所有UI組件的基礎類。它表示屏幕上的一個矩形區域,負責繪制內容和處理用戶交互事件。所有的 UI 組件(如按鈕、文本框等)都是 View 的子類,而 ViewGroup 是一種特殊的 View,它可以包含其他 View 或 ViewGroup,用于定義布局結構。View 的主要功能包括繪制內容、響應用戶事件以及與父容器的交互。它可以顯示文本、圖片、視頻等內容,并處理觸摸、點擊等操作。

2. View 的位置參數

View的位置主要由四個參數決定,這些參數都是相對其父容器的坐標:

  • left:View左邊到父容器左邊的距離
  • top:View頂部到父容器頂部的距離
  • right:View右邊到父容器左邊的距離
  • bottom:View底部到父容器頂部的距離

在Android中,x軸和y軸的正方向分別為右和下。

獲取View寬高的方法:

// 獲取View的寬度
int width = view.getRight() - view.getLeft();
// 或者使用簡便方法
int width = view.getWidth();// 獲取View的高度
int height = view.getBottom() - view.getTop();
// 或者使用簡便方法
int height = view.getHeight();

從Android 3.0開始,View增加了額外的參數:

  • xy:View左上角的坐標,相對于父容器
  • translationXtranslationY:View左上角相對于父容器的偏移量

它們之間的關系為:

x = left + translationX
y = top + translationY

3. MotionEvent 和 TouchSlop

3.1 MotionEvent

MotionEvent是觸摸事件類,包含了觸摸動作、位置等信息。常見的觸摸事件類型包括:

  • ACTION_DOWN:手指按下屏幕
  • ACTION_MOVE:手指在屏幕上移動
  • ACTION_UP:手指從屏幕抬起
  • ACTION_CANCEL:觸摸事件被取消

獲取觸摸點坐標的方法:

@Override
public boolean onTouchEvent(MotionEvent event) {// 獲取相對于當前View的x坐標float x = event.getX();// 獲取相對于當前View的y坐標float y = event.getY();// 獲取相對于屏幕的原始坐標float rawX = event.getRawX();float rawY = event.getRawY();return true;
}

3.2 TouchSlop

TouchSlop是系統識別的被認為滑動的最小距離,小于這個距離的移動不會被識別為滑動。這個常量由設備制造商定義,不同設備可能不同。

獲取TouchSlop的方法:

ViewConfiguration.get(context).getScaledTouchSlop()

在實際開發中,處理滑動時應考慮TouchSlop,以避免過于敏感的滑動檢測:

private int mTouchSlop;
private float mLastX;public MyView(Context context) {super(context);mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}@Override
public boolean onTouchEvent(MotionEvent event) {float x = event.getX();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX = x;break;case MotionEvent.ACTION_MOVE:float deltaX = Math.abs(x - mLastX);if (deltaX > mTouchSlop) {// 這是一個有效的滑動}break;}return true;
}

4. VelocityTracker、GestureDetector

4.1 VelocityTracker

VelocityTracker用于追蹤手指滑動的速度,包括水平和垂直方向的速度。速度的計算單位通常是"每秒移動的像素數(px/s)"。

使用VelocityTracker的基本步驟:

// 在View的onTouchEvent方法中
private VelocityTracker mVelocityTracker;@Override
public boolean onTouchEvent(MotionEvent event) {if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}mVelocityTracker.addMovement(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 處理按下事件break;case MotionEvent.ACTION_MOVE:// 處理移動事件break;case MotionEvent.ACTION_UP:// 計算速度mVelocityTracker.computeCurrentVelocity(1000); // 計算單位:1000ms內的像素數float xVelocity = mVelocityTracker.getXVelocity();float yVelocity = mVelocityTracker.getYVelocity();// 使用速度值進行相關處理// 回收VelocityTrackerif (mVelocityTracker != null) {mVelocityTracker.recycle();mVelocityTracker = null;}break;}return true;
}

注意:獲取速度值前必須先調用computeCurrentVelocity()方法,參數表示時間單位(毫秒)。

4.2 GestureDetector

GestureDetector用于輔助檢測用戶的單擊、長按、滑動、雙擊等手勢。它簡化了復雜手勢的識別過程。

使用GestureDetector的基本步驟:

  1. 創建GestureDetector實例
  2. 實現GestureDetector.OnGestureListener接口
  3. 在View的onTouchEvent()方法中轉發觸摸事件
public class MyView extends View implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {private GestureDetector mGestureDetector;public MyView(Context context) {super(context);mGestureDetector = new GestureDetector(context, this);// 解決長按后無法拖動的問題mGestureDetector.setIsLongpressEnabled(false);}@Overridepublic boolean onTouchEvent(MotionEvent event) {return mGestureDetector.onTouchEvent(event);}// OnGestureListener方法@Overridepublic boolean onDown(MotionEvent e) {// 按下動作return true; // 必須返回true,否則后續事件不會傳遞}@Overridepublic void onShowPress(MotionEvent e) {// 按下但未移動或抬起}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// 單擊抬起return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {// 滾動操作return false;}@Overridepublic void onLongPress(MotionEvent e) {// 長按事件}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {// 快速滑動后抬起return false;}// OnDoubleTapListener方法@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {// 嚴格的單擊確認(非雙擊中的第一次點擊)return false;}@Overridepublic boolean onDoubleTap(MotionEvent e) {// 雙擊事件return false;}@Overridepublic boolean onDoubleTapEvent(MotionEvent e) {// 雙擊事件中的ACTION_DOWN、ACTION_MOVE和ACTION_UPreturn false;}
}

如果不需要處理所有手勢,可以使用SimpleOnGestureListener類,它提供了所有方法的空實現,只需重寫需要的方法。


請添加圖片描述

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

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

相關文章

西門子 S7-200 SMART PLC 實現電機點動與連續運行綜合控制

在工業生產中,電機控制并非單一模式:調試設備時需要 “按動即轉、松開即停” 的點動功能,正常生產時則需要 “一鍵啟動、持續運行” 的連續控制。本文以西門子 S7-200 SMART PLC 為載體,詳細講解電機點動控制原理,并設…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sphinx-rtd-theme’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sphinx-rtd-theme’問題 摘要 在使用 PyCharm 開發 Python 項目時,pip install 報錯是常見痛點。特別是在構建文檔或引入第三方庫時,開…

HakcMyVM-Literal

目錄信息搜集漏洞利用權限提升信息搜集 主機發現 ┌──(kali?kali)-[~] └─$ nmap -sn 192.168.21.0/24 Nmap scan report for 192.168.21.5端口掃描 ┌──(kali?kali)-[~] └─$ nmap -sS -sV -O -p- 192.168.21.5 Starting Nmap 7.95 ( https://nmap.org ) a…

0904 類的繼承

Part 1.梳理思維導圖一.繼承中的特殊成員函數1.構造函數父類的構造函數會被繼承到子類中&#xff0c;在構造的順序中&#xff0c;是先構造父類&#xff0c;再構造子類#include <iostream>using namespace std;class Father { public:string name; protected:int *age; pr…

PDF教程|如何把想要的網頁保存下來?

前段時間有個小伙伴咨詢了小白&#xff1a;領導想要某個網頁的整個頁面&#xff0c;有沒有比較好的方法把它保存下來&#xff1f; 在他找到小白之前&#xff0c;這種事情他已經接到好幾次了&#xff0c;每次都是怎么解決的呢&#xff1f;其實很簡單&#xff0c;就是打開Word&a…

【bash】命令查看當前目錄下文件個數

要用 ls 查看當前目錄下的文件個數&#xff0c;可以結合 wc -l 來統計行數&#xff1a; ls -1 | wc -l說明&#xff1a; ls -1&#xff1a;以一行一個文件的方式列出。wc -l&#xff1a;統計行數&#xff0c;也就是文件/目錄的數量。 ?? 需要注意&#xff1a; 這個方法會把文…

「日拱一碼」081 機器學習——梯度增強特征選擇GBFS

目錄 什么是梯度增強特征選擇&#xff08;GBFS&#xff09; 為什么 GBM 適合做特征選擇 GBFS 的一般步驟 代碼示例 什么是梯度增強特征選擇&#xff08;GBFS&#xff09; GBFS 并非一個像 Lasso 或隨機森林那樣有嚴格標準定義的獨立算法&#xff0c;而是一種基于梯度提升機…

解構匯編, 萬物起源

匯編的誕生匯編全景圖核心主干: CPU架構主要分支: 語法和工具共同的地貌: 核心概念延伸: 跨平臺 & 跨架構跨平臺跨架構總結以 GAS vs. NASM 為例NASM 不支持跨架構 ≠ 無法在ARM架構上的系統安裝匯編的誕生 機器語言的困境 早期的程序員直接使用機器語言進行編程機器語言由…

廣州旅游網站系統 - 純靜態旅游展示平臺

&#x1f31f; 廣州旅游網站系統 - 純靜態旅游展示平臺觀世界才有世界觀 - 一個集景區展示、旅游攻略、文化傳播于一體的精美旅游網站&#x1f4cb; 項目概述 這是一個專注于廣州旅游文化的純靜態網站系統&#xff0c;采用現代化的前端技術棧&#xff0c;為游客提供全方位的廣州…

Qt UDP通信學習

Qt UDP通信學習 一、項目概述 本項目基于Qt框架實現了UDP通信功能&#xff0c;支持單播與廣播消息收發&#xff0c;展示了UDP套接字的基本用法&#xff0c;適合初學者學習Qt網絡模塊的實際應用。 二、項目結構 55.pro&#xff1a;Qt工程文件&#xff0c;配置模塊與源碼文件main…

古德哈特定律(Goodhart‘s Law)

古德哈特定律&#xff08;Goodhart’s Law&#xff09;表述為“當一個指標變成了目標&#xff0c;它將不再是個好指標”。 該定律由英國經濟學家查爾斯古德哈特&#xff08;Charles Goodhart&#xff09;在1975年提出&#xff0c;最初用于批判撒切爾夫人政府的貨幣主義政策&…

在 ASP.NET Core 8 Web API 中實現基于角色的授權 安全且可擴展 API 的最佳實踐

掌握基于角色的授權&#xff1a;使用專家策略保護您的 ASP.NET Core 8 Web API。在 ASP.NET Core 8 Web API 中實現基于角色的授權&#xff1a;安全且可擴展 API 的最佳實踐介紹授權是任何 Web 應用程序的關鍵組件。在開發 API 時&#xff0c;使用基于角色的授權保護端點可確保…

AutoHotkey識別圖片

一、下載ImagePut插件 下載地址&#xff1a;GitHub - iseahound/ImagePut: A core library for images in AutoHotkey. Supports AutoHotkey v1 and v2. 二、將插件和要搜索的圖片導入項目 #Include ./plugin/ImagePut.ahk ; 截取當前屏幕 pic : ImagePutBuffer(0) point : p…

CamX-Camera常用編譯命令和adb指南

g_camxsettings vendor/qcom/proprietary/camx/src/settings/g_camxsettings.xml 控制相機debug的信息都在該文件里面 0、相關代碼 framwork層 frameworks/av/camera/ frameworks/av/services/camera frameworks/av/services/camera frameworks/hardware/interfaces/camerase…

LabVIEW 實現顏色平滑漸變控制

LabVIEW 中實現 LED 顏色從藍到紅的平滑漸變顯示在 LabVIEW 開發中&#xff0c;若需讓 LED&#xff08;或類 LED 顯示控件&#xff09;實現從藍色到紅色的平滑色彩漸變&#xff08;模擬溫度等參數從低到高的視覺反饋&#xff09;&#xff0c;可通過自定義顏色查找表 數值縮放映…

陰陽學:從入門到精通

第一篇&#xff1a;入門篇——陰陽基礎理論1.1 陰陽的起源與哲學意義陰陽概念的歷史淵源《易經》中的陰陽思想陰陽與宇宙、自然、人生的關系陰陽對思想、行為、社會的影響1.2 陰陽的基本屬性與符號陰陽的特征、象征與對立統一陰陽在自然界的表現&#xff08;晝夜、冷熱、動靜等…

Java工業通信實戰(三):Modbus RTU串口通信實現

想象一下&#xff0c;你要和一臺工業設備"對話"&#xff0c;比如詢問溫度傳感器"現在多少度&#xff1f;“或者告訴電機"轉快一點”。 Modbus RTU就是這種"對話"的標準語言&#xff0c;就像人與人之間說普通話一樣。 它采用主從結構&#xff0c;…

CentOS安裝或升級protoc

卸載舊版本 sudo yum remove protobuf protobuf-c protobuf-compiler -y sudo rm -f /usr/bin/protoc sudo rm -rf /usr/include/google/protobuf 下載 wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.0/protoc-3.15.0-linux-x86_64.zip unz…

人工智能在醫學圖像中的應用:從機器學習到深度學習

目的&#xff1a;人工智能&#xff08;AI&#xff09;模型在生物醫學研究和醫療服務中扮演著越來越重要的角色。本綜述聚焦于在現實世界背景下&#xff0c;開發AI應用作為臨床決策支持系統時需要澄清的挑戰性問題。方法&#xff1a;進行了一項敘述性綜述&#xff0c;包含對1989…

基于Echarts+HTML5可視化數據大屏展示-智慧小區大數據分析

效果展示&#xff1a;代碼結構&#xff1a;主要代碼實現 index.html布局 <!doctype html> <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title>智慧農業大數據展示</title><link rel"s…