ピンチイン・ピンチアウト】この記事は2015年11月24日に書かれたものです。内容が古い可能性がありますのでご注意ください。TweetAndroidには残念なことにピンチイン・ピンチアウトによる縮小・拡大にデフォルトで対応したViewがありません。そこでAndroidアプリ内で表示している画像を、ピンチインにより縮小・ピンチアウトによる拡大できるように、また加えてドラッグによる画像のスクロール移動できるようにカスタマイズしたImageViewをのせたいと思います。記事は二回にわけ前編の本記事ではピンチイン・ピンチアウトに対応させたいと思います。ポイントは以下の三点です。}}CustomImageViewのコンストラクタでScaleGestureDetectorのインスタンスを取得しておきます。ScaleGestureDetectorのコンストラクタの第二引数にはScaleGestureDetector.OnScaleGestureListenerインターフェースのインスタンスを与えます。scaleGestureDetector.onTouchEvent(event);}onTouchEventが呼ばれた際にScaleGestureDetector#onTouchEventを呼ぶことで処理をScaleGestureDetectorオブジェクトに委譲しています。MatrixMatrixオブジェクトの値はMatrix#getValuesを呼ぶことでfloat配列に格納することができます。配列の値はMatrixクラスの定数をインデックスに与えて取り出します。使うのは次の四つです。MSCALE_XMSCALE_YMTRANS_XMTRANS_YMSCALE_X,MSCALE_Yはそれぞれx方向y方向の画像の縮小・拡大率です。本サンプルではxyの比率は維持するため実質的に両者はイコールです。MTRANS_X,MTRANS_Yはそれぞれ画像の左上頂点(ImageViewの頂点ではない)の座標です。ScaleGestureDetector.SimpleOnScaleGestureListenerScaleGestureDetector.SimpleOnScaleGestureListenerインターフェースは以下の三つのメソッドを実装しなければなりません。ジェスチャーの開始時(2本指でタッチしたとき)に呼ばれるonScaleBeginジェスチャー中に呼ばれるonScaleジェスチャー終了時に呼ばれるonScaleEndonScaleBeginではタッチした2点の中心点をScaleGestureDetector#getFocusX,Yで取得し保持onScaleではMatrix#postScaleを呼びMatrixオブジェクトを操作した後View#invalidateを呼ぶことでImageViewの再描画を行っています。*本サンプルではSCALE_MAXにより(元画像からの)拡大率の最大値を、SCALE_MINにより(元画像からの)縮小率の最小値を設定しています。*ジェスチャーの距離変化比をそのまま用いると反応が良すぎるため、定数PINCH_SENSITIVITYで割ることで動きをゆるやかにしています。CustomImageViewを作れたので後はlayoutファイルに書いてあげれば使えます。android:layout_width="match_parent"/></LinearLayout>ScaleGestureDetectorを用いてピンチイン・ピンチアウトに対応したカスタムImageViewを作成しました。次回はImageViewをドラッグによる移動に対応させたいと思います。