fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

rotationを指定したViewをEspressoでクリックできない件

github.com

クローンしてエミュレータなどでandroidTestを実行してみてください。

なぜ?

EspressoのViewActions.click()は内部でGeneralClickActionを使ってクリックアクションを作っている。GeneralClickActionを生成する際にいくつか引数を渡す必要があるのだが、この中でクリックする位置を決めているのは2個目の引数であるCoordinatesProviderクラスのオブジェクトである。click()ではその実装であるGeneralLocation enumクラスのGeneralLocation.VISIBLE_CENTERが渡されている。

この実装の中ではView.getLocationOnScreen()で得た対象のViewの左上の座標に、Viewの幅と高さの半分の値をそれぞれXとY座標に足して返している。ここで問題なのは、View.getLocationOnScreen()で取得できる座標はもともとのViewの左上の座標に回転変形のマッピング計算を施したものであること。例えば、もともとのViewの中心を軸にして右に30度回転しているとすれば、返ってくる値も右上方向にずれることになる。そこを起点にして元々のViewの幅と高さの半分をそれぞれXとYに足しても、回転後のViewの中心にはならない。正方形のViewであれば、45度以上回転するとViewの外側に出てしまう。

サンプル実装のリポジトリではView.getGlobalVisibleRect()を使って、回転したViewを内包するRectを取得してその中心座標を返すCoordinatesProviderを実装し、GeneralClickActionに渡している。これによって一応クリックできるようになっている。