3

我需要在我的 APK 中为触摸屏实现一种死区,这样活动就不会从这些区域接收任何触摸事件。一旦多点触控事件与第一次触地相关联,这似乎不是一件容易的事。

假设我有一个包含两个并排视图的布局,并且想要忽略右侧视图中的所有触摸活动(“死”视图是不可触摸的)。

对于单次触摸它是微不足道的。

但对于多点触控,第一次触控决定一切:

  1. 如果第一个在“死”视图中,我根本就没有事件。

  2. 如果第一个在“生命”视图中,而第二个在“死”视图中,我会收到多点触控事件 ACTION_POINTER_DOWN_2。

目前,我必须接收原始流中的所有事件,并根据我的“死区”规则将其转换为另一个事件流。

但问题是:我们是否有任何有用的 API 将触摸屏事件处理限制在我们只需要的区域?

PS我需要所有这些来过滤玩游戏时屏幕两侧附近的意外触摸。

谢谢。

4

1 回答 1

1

如果你想要两种布局,一种是活的,一种是死的,你应该在View.OnTouchListener每个布局中添加你自己的。

我做了一个例子,这里是活动:

public class MainActivity extends ActionBarActivity {
TextView text;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    LinearLayout linearLayoutDead = (LinearLayout) findViewById(R.id.dead);
    linearLayoutDead.setOnTouchListener(onTouchDeadListener);
    LinearLayout linearLayoutLive = (LinearLayout) findViewById(R.id.live);
    linearLayoutLive.setOnTouchListener(onTouchLiveListener);

    text = (TextView) findViewById(R.id.textView);
}

private View.OnTouchListener onTouchDeadListener = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        text.setText(motionEvent.toString());
        return false;
    }

};

private View.OnTouchListener onTouchLiveListener = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        text.setText(motionEvent.toString());
        return true;
    }

};

}

和布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_weight="1">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:id="@+id/textView"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/live"
    android:layout_weight="1"
    android:background="@color/background_floating_material_dark">
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/dead"
    android:layout_weight="1">
</LinearLayout>

我们覆盖该OnTouch方法,您会看到,当我们在“死区”上进行单次或多次触摸时,我们会得到初始响应,但没有进一步的响应。但是,当我们第一次接触“活区”而第二次接触死区时,情况会怎样呢?

对于这种情况,您应该为您的OnTouch方法添加一个新条件,如下所示:

private View.OnTouchListener onTouchLiveListener = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if(motionEvent.getPointerCount()>1){
            if(motionEvent.getY(1) > someNumber){
                //Case when we touch the dead zone, TODO do some ...
            }
        }
        text.setText(motionEvent.toString());
        return true;
    }

};

因此,在这种特殊情况下,我们可以检查触摸何时发生在“活动区域”下,然后简单地忽略它或实现我们想要的任何行为。

希望这会有所帮助。问候何塞

于 2015-01-12T18:22:25.613 回答