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

Android 佈局整體點擊觸發子控件選中狀態:setPressed 傳遞按下事件

     編輯:程式設計綜合問答

場景

LinearLayout 內含 ImageView + TextView,點擊整個佈局時需讓 ImageView 顯示按下狀態(Selector 效果)。

解決方案

linearLayout.setOnClickListener(v -> {
    // 手動觸發子控件按下狀態
    imageView.setPressed(true);
    // 延遲釋放,產生視覺反饋
    imageView.postDelayed(() -> imageView.setPressed(false), 100);

    // 業務邏輯...
});

Selector 定義 (res/drawable/selector_img.xml)

<selector xmlns:android="...">
    <item android:state_pressed="true" android:drawable="@drawable/img_pressed" />
    <item android:drawable="@drawable/img_normal" />
</selector>

ImageView 設置 `android:src="@drawable/selector_img"`。

原理

  • `View.setPressed(true)` 設置 `PRESSED` 狀態標誌,Selector 監聽該狀態切換圖片。
  • `postDelayed` 確保按下狀態可見(至少 100ms),否則瞬間釋放用戶無感知。

替代:自定義佈局分發觸摸事件

public class ClickableLayout extends LinearLayout {
    public ClickableLayout(Context ctx, AttributeSet attrs) { super(ctx, attrs); }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return true; // 攔截觸摸,子控件不再接收
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) setPressed(true);
        else if (ev.getAction() == MotionEvent.ACTION_UP) {
            setPressed(false);
            performClick(); // 觸發 OnClickListener
        } else if (ev.getAction() == MotionEvent.ACTION_CANCEL) setPressed(false);
        return true;
    }
}

佈局文件直接用 ``,內部 ImageView 共享父佈局 Pressed 狀態。

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