首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android View 滑動經過檢測:重寫父佈局 onTouchEvent 實現區域進入回調

     編輯:程式設計疑難解答

需求

檢測某個子 View 是否被手指滑動經過 (非點擊,非拖拽該 View 本身),觸發回調。

核心方案:父佈局攔截觸摸事件


public class DetectableFrameLayout extends FrameLayout {
    private View targetView;
    private OnViewPassedListener listener;

    public interface OnViewPassedListener {
        void onViewPassed(View view, MotionEvent event);
    }

    public DetectableFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setTargetView(View targetView, OnViewPassedListener listener) {
        this.targetView = targetView;
        this.listener = listener;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (targetView != null && listener != null) {
            // 獲取觸摸點在父佈局坐標系下的位置
            float x = event.getX();
            float y = event.getY();
            
            // 獲取目標 View 在父佈局中的矩形區域
            Rect rect = new Rect();
            targetView.getHitRect(rect); // 或 getGlobalVisibleRect(rect) 配合 offset
            
            // 判斷觸摸點是否在目標區域內
            if (rect.contains((int)x, (int)y)) {
                listener.onViewPassed(targetView, event);
            }
        }
        return super.onTouchEvent(event); // 繼續分發
    }
}

使用方式


// XML

    


// Activity/Fragment
DetectableFrameLayout root = findViewById(R.id.root);
View target = findViewById(R.id.target_view);
root.setTargetView(target, (view, event) -> {
    // 手指滑過 target 區域時回調
    // 可根據 event.getAction() 區分 DOWN/MOVE/UP
});

關鍵點

  • `getHitRect(rect)` 獲取 View 在**父佈局坐標系**的矩形,配合 `event.getX/Y()` (同坐標系) 直接 `contains` 判斷。
  • 若 View 在嵌套滑動容器 (ScrollView/RecyclerView) 中,需用 `getGlobalVisibleRect` 並轉換坐標系。
  • 此方案**不消費事件** (`return super...`),不影響子 View 原有點擊/滑動行為。

替代方案:View.OnTouchListener + 代理

若不想自定義父佈局,可在父 View 設置 `OnTouchListener`,邏輯相同。但 `onTouchEvent` 覆寫更符合「父佈局統一檢測多個子 View」的擴展需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved