3

我有一个RelativeLayout和一个ImageView
布局如下 -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black" >

<ImageView
    android:id="@+id/ivIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/ic_launcher" />

</RelativeLayout>

Activity代码是 -

public class MainActivity extends Activity implements OnClickListener{

private RelativeLayout rlMain;
private ImageView ivIcon;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    rlMain = (RelativeLayout) findViewById(R.id.rlMain);
    ivIcon = (ImageView) findViewById(R.id.ivIcon);
    rlMain.setOnClickListener(this);
    ivIcon.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.rlMain:
        Toast.makeText(this, "Relative Layout clicked", Toast.LENGTH_SHORT).show();
        break;

    case R.id.ivIcon:
        Toast.makeText(this, "Image View clicked", Toast.LENGTH_SHORT).show();
        break;
    }

}

}

我已经为RelativeLayout(父)和ImageView(子)应用了点击监听器。
单击相对布局时 - 它由相对布局单击处理程序处理。(这似乎是正确的)。

单击 Imagview 时 - 它由 imageview 处理。(这里是混乱)。

是否应该由父级(相对布局)和子级(imageview)处理对 imageview 的点击?如果只有子视图处理点击,逻辑是什么?

4

3 回答 3

3

clickEvent 将被传递到布局层次结构中的最低子元素。如果此元素没有 onClick 行为,它将把事件向上传递给它的父元素,直到事件被处理。

因此,您可以将 LinearLayout 视为您的 onClick 行为的一个块。如果您在布局中创建另一个可点击元素,请确保将其设置得足够大,以减少用户错过正确项目的机会。

资料来源: 使父元素可点击是否会使所有子元素也可点击?

于 2016-08-26T14:09:12.293 回答
0

Normally in cases where the image to be clicked is very small in dimension the imageView is kept inside a layout which is given some padding, then the click of the layout is handled. This gives enough area on screen for the user to click on

于 2013-07-31T11:37:03.197 回答
0
  1. 覆盖 dispatchTouchEvent 函数
  2. 获取触动点
  3. 获取视图的位置。您可以根据需要使用getGlobalVisibleRect()getLocalVisibleRect()检测视图的位置。
  4. 设置简单的 if 语句并找到点的位置是否在 ImageView 中。
  5. 动作应该是MotionEvent.ACTION_DOWN在用户在屏幕上进行滑动动作的情况下仅获得第一次触摸。

Kotlin 代码:

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
    if(ev?.action == MotionEvent.ACTION_DOWN) {
        val pointX = ev.x
        val pointY = ev.y
        val locationIvIcon = Rect()
        if(iv_icon.getGlobalVisibleRect(locationIvIcon)) {
            if(isInChildView(pointX, pointY, locationSendGiftPopup)) {
                // Do action for ImageView
            } else {
                // Do action for RelativeLayout
            }
        }
    }
    return super.dispatchTouchEvent(ev)
}


private fun isInChildView(x: Float?, y: Float?, location: Rect): Boolean {
        x?.let {
            y?.let {
                return x >= location.left && x <= location.right 
                        && y >= location.top && y <= location.bottom
            }
        }
        return false
    }
于 2020-07-24T14:47:31.107 回答