Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android】ImageViewのズームイン・ズームアウトを実装する方法

この記事では、AndroidアプリのImageViewに対して、ピンチイン(指をつまむ)・ピンチアウト(指を広げる)ジェスチャーで画像を拡大・縮小できる「ズームイン・ズームアウト」機能を実装する方法を解説します。

実装のポイント

ズーム機能の実装には、Android SDKに標準で用意されているScaleGestureDetectorクラスを使用します。このクラスは2本指のスケールジェスチャーを検出し、拡大率(スケールファクター)を取得できるため、独自に複雑なタッチ処理を書く必要がありません。

実装手順

ステップ1:新規プロジェクトの作成

Android Studioで新しいプロジェクトを作成します。メニューから「File ⇒ New Project」を選択し、必要な情報を入力してプロジェクトを作成してください。

ステップ2:レイアウトファイルの編集

res/layout/activity_main.xml に以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    android:gravity="center"
    tools:context=".MainActivity">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/image" />
</LinearLayout>

ここでは画面いっぱいに表示されるImageViewを配置し、表示する画像として @drawable/image を指定しています。任意の画像リソースを drawable フォルダに配置しておきましょう。

ステップ3:MainActivity.javaの編集

src/MainActivity.java に以下のコードを追加します。

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
    private ScaleGestureDetector scaleGestureDetector;
    private float mScaleFactor = 1.0f;
    private ImageView imageView;  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView=findViewById(R.id.imageView);
        scaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener());
    }
    @Override
    public boolean onTouchEvent(MotionEvent motionEvent) {
        scaleGestureDetector.onTouchEvent(motionEvent);
        return true;
    }
    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
        @Override
        public boolean onScale(ScaleGestureDetector scaleGestureDetector) {
            mScaleFactor *= scaleGestureDetector.getScaleFactor();
            mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f));
            imageView.setScaleX(mScaleFactor);
            imageView.setScaleY(mScaleFactor);
            return true;
        }
    }
}

このコードの動作は以下の通りです。

  • onTouchEvent() ですべてのタッチイベントをScaleGestureDetectorに渡します。
  • SimpleOnScaleGestureListener の onScale() が呼ばれるたびに、getScaleFactor() で取得した倍率を現在のスケールに掛け合わせます。
  • Math.max() と Math.min() を使うことで、拡大率を0.1倍〜10倍の範囲に制限しています。これにより、極端な縮小や拡大を防ぎます。
  • 最後に setScaleX() / setScaleY() でImageViewの拡大率を更新します。

ステップ4:AndroidManifest.xmlの確認

androidManifest.xml は以下のようになります。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリの実行

それではアプリを実行してみましょう。実際のAndroid端末をパソコンに接続しているものとします。Android Studioからアプリを起動するには、プロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックします。実行デバイスとして自分のスマートフォンを選択すると、端末にアプリの初期画面が表示されます。

【Android】ImageViewのズームイン・ズームアウトを実装する方法

【Android】ImageViewのズームイン・ズームアウトを実装する方法

画面上で2本指を使ってピンチイン・ピンチアウト操作を行うと、画像が滑らかに拡大・縮小されることが確認できます。ScaleGestureDetectorを活用すれば、少ないコード量で直感的なズーム操作を実現できますので、ギャラリーアプリや地図表示など、さまざまな場面で応用してみてください。

  1. Androidで文字列に下付き文字・上付き文字を表示する方法

    はじめにこのチュートリアルでは、Androidアプリで文字列の一部を下付き文字(Subscript)や上付き文字(Superscript)として表示する方法を解説します。化学式(H₂Oなど)や数式(X²など)を表示したい場合、SpannableStringBuilderとSubscriptSpan、SuperscriptSpanを組み合わせることで、簡単に実現できます。ステップ1:新規プロジェクトの作成Android Studioを開き、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な情報をすべて入力してください。ステップ2:レイアウトファイルの編集re

  2. Androidで円形のImageViewに影と境界線を追加する方法【コード例付き】

    はじめにこの記事では、AndroidアプリのImageViewに表示する画像を円形に切り取り、さらに白い境界線と影(外枠)を追加する方法を、実際のコード例とともに段階的に解説します。ポイントは、RoundedBitmapDrawableFactoryで生成できるRoundedBitmapDrawableを使って画像を円形化し、PaintとCanvasを使って境界線や影を描画するところです。手順1:新規プロジェクトを作成するAndroid Studioを開き、メニューから「File」→「New Project」を選択して、必要な項目を入力し新しいプロジェクトを作成します。今回は空のアクティビティ