読者です 読者をやめる 読者になる 読者になる

visible true

技術的なメモを書く

Androidでスクロールを含む画面全体のスクリーンショットを撮る

Android端末でスクリーンショットが撮れるようになって久しいですが、スクロールを含む画面全体のスクリーンショットについてはサポートされていません。デザインの全体を俯瞰してレビューする際などにはスクロールを含む画面全体のスクリーンショットがあると助かります。

PGSSoft/scrollscreenshotを利用すると比較的カンタンにスクロールを含む画面全体のスクリーンショットを撮れます。

セットアップ

リポジトリをcloneすれば利用できます。

git clone https://github.com/PGSSoft/scrollscreenshot.git

スクロールしながらスクリーンショットを撮る

scrollscreenshotはjarで提供されています。javaコマンドでスクリーンショットを撮るクラスを実行すれば良いのですがその前にいくつか準備が必要です。

環境変数ANDROID_SDK_HOMEを設定する

ANDROID_SDK_HOMEが設定されてない場合は.bash_profileなどに追加してください。実行時引数として渡すこともできますが面倒だと思うので環境変数を設定しておくと良いでしょう。

export ANDROID_SDK_HOME=/usr/local/opt/android-sdk

デバイスのデジタイザの入力番号を確認する

scrollscreenshotはadbでデバイスに接続し、デジタイザに対して直接タッチイベントを送信してスクロールをします。以下のコマンドを使って対象となるデバイスのデジタイザの入力番号を調べて下さい。

adb shell getevent -l

色々なイベントが流れてきます。最初は複数の入力番号が出てきますが端末を操作すると同じデジタイザで沢山イベントが発生するので判別ができます。以下のログだと/dev/input/event5の末尾の5が入力番号となります。

/dev/input/event5: EV_SYN       SYN_REPORT           00000000            
/dev/input/event5: EV_ABS       ABS_MT_POSITION_X    0000021f            
/dev/input/event5: EV_ABS       ABS_MT_POSITION_Y    0000051e            
/dev/input/event5: EV_SYN       SYN_MT_REPORT        00000000            
/dev/input/event5: EV_SYN       SYN_REPORT           00000000            
/dev/input/event5: EV_ABS       ABS_MT_POSITION_X    0000022c            

スクリーンショットを撮る

scrollscreenshotのバイナリにある場所に移動し、javaコマンドを使って実行します。-iオプションにデジタイザの入力番号を設定すれば正しくスクロールされ縦長のスクリーンショットが撮れるはずです。画像は実行したディレクトリの直下にout.pngという名前で保存されます。

cd scrollscreenshot/binaries
java -cp scrollscreenshot-latest.jar com.pgssoft.scrollscreenshot.ScrollScreenShot -i 5

こんな感じでスクリーンショットが撮れます(仕組み上ガタつく所が出ます)。

f:id:sys1yagi:20160127232235p:plain

注意点とオプション

scrollscreenshotはadb接続をしてスクロールをしながらスクリーンショットを撮って最後に結合するという仕組みで動いており画面上のスクロールの状態については関与できません。このためスクリーンショットを撮る画面毎にスクロール回数を調整する必要があります。スクロール回数(スクリーンショットの回数)は-cで指定できます。この他にもいくつかオプションがあります。

scrollscreenshotのオプションを次に示します*1

Usage: com.pgssoft.scrollscreenshot.ScrollScreenShot [options]
  Options:
    -c, --count
       スクロールの回数
       デフォルト: 5
    -v, --device
       複数の端末が接続されている場合Device IDを指定できます。特に指定がなければ最初のデバイスに接続します
    -d, --direction
       スワイプの方向を指定できます。topdown (default), leftright 
       デフォルト: topdown
    -h, --help
       ヘルプ
       デフォルト: false
    -e, --inertia
       コンテンツの慣性。スクロールに必要なピクセル数を指定できます
       デフォルト: 0
  * -i, --inputdevice
       デジタイザの入力番号。 /dev/input/eventNのN
       デフォルト: 1
    -n, --nameprefix
       出力ファイルのプレフィクス
       デフォルト: out
    -p, --pathsdk
       Android SDKのパス
    -s, --stitch
       画像の結合方法: full (つなぎ目がスムーズ), none (差分を気にせずそのまま結合する),
       separate (別々のファイルに分ける)
       デフォルト: full

enjoy

scrollscreenshotのソースを読むとjavaからAndroidDebugBridgeでadb接続してBufferedImageを使って結合などしていてとてもシンプルなので簡単に俺得スクリーンショットツールが作れるんじゃないかなと思います。タッチイベントも送出できるので特定動作を繰り返す仕組みとかできるんじゃないですかね。

*1:README.mdから抜粋し日本語化しました