Android SDKでJPG画像を画像に合わせて拡大縮小表示する

test119_01.png
今回はAndroid SDKでjpgファイルを読み込み、画面サイズに合わせて拡大縮小表示する。

まずは雛形となるプロジェクトをEasyProjectGenerator for Androidで作る。JavaのSimpleプロジェクトを利用した。

test119_02.png
そしてEclipseにプロジェクトを取り込み、「ImageFileView.java」ファイルを新しく作成してImageViewクラスを実装する。

jpg画像の読み込みはBitmapFactory.decodeFile()で行い、Bitmap.createBitmap()にMatrixを渡すことで拡大縮小、Canvas::drawBitmap()で範囲を指定して描画する。

ImageViewにBitmapやBitmapDrawableを渡す方法は、ImageViewが勝手に拡大縮小をするために利用できない。
package com.Test119;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;


public class ImageFileView extends View
{
	private	Bitmap	_bmpImageFile;		//画像ファイル
	private	Bitmap	_bmpResized;		//リサイズ画像
	private	int		_nWidthDisp;		//画面幅
	private	int		_nHeightDisp;		//画面縦


	public ImageFileView(Context context)
	{
		super(context);

		//画面サイズ取得
		WindowManager	wmWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
		Display			display = wmWindowManager.getDefaultDisplay();
		_nWidthDisp		= display.getWidth();
		_nHeightDisp	= display.getHeight();
		Log.d("Test119","DisplaySize " + _nWidthDisp + "x" + _nHeightDisp);

		//画像ファイル読み込み
		LoadImageFile("/sdcard/test.jpg",false);	//描画更新しない
	}


	@Override
	public boolean onTouchEvent(MotionEvent event)
	{
		//タッチイベント取得
		if(event.getAction() == MotionEvent.ACTION_DOWN)
		{
			LoadImageFile("/sdcard/test2.jpg",true);
		}
		return true;
	}	


	public boolean	LoadImageFile(String strFile,boolean bInvalidate)
	{
		//画像読み込み
		_bmpImageFile = BitmapFactory.decodeFile(strFile);
		
		int		nWidth = _bmpImageFile.getWidth();
		int		nHeight = _bmpImageFile.getHeight();
		Log.d("Test119","ImageSize " + nWidth + "x" + nHeight);

		float	fScale;

		//拡大縮小率取得
		if(true)
		{
			//画像に合わせる
			if((long)nWidth * _nHeightDisp > (long)_nWidthDisp * nHeight)
				fScale = (float)_nWidthDisp / nWidth;
			else
				fScale = (float)_nHeightDisp / nHeight;
		}
		else if(false)
		{
			//高さに合わせる
			fScale = (float)_nHeightDisp / nHeight;
		}
		else
		{
			//幅に合わせる
			fScale = (float)_nWidthDisp / nWidth;
		}

		//リサイズ
		Matrix	matrix = new Matrix();
		matrix.postScale(fScale,fScale,0,0);
		_bmpResized = Bitmap.createBitmap(_bmpImageFile,0,0,nWidth,nHeight,matrix,true);

		if(bInvalidate)
			invalidate();		//表示更新

		return	(_bmpImageFile != null) ? true : false;
	}


	@Override
	protected void onDraw(Canvas canvas)
	{
		if(_bmpImageFile == null)
		{
			super.onDraw(canvas);
			return;
		}


		//描画
        Rect	rect = new Rect(0,0,_bmpResized.getWidth(),_bmpResized.getHeight());
        canvas.drawBitmap(_bmpResized,rect,rect,null);
	}
}

test119_03.png
上で実装したImageFileViewをアクティビティに結びつける。

今回はさらにタイトル消去とフルスクリーン化も行った。
package com.Test119;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class Test119Act extends Activity
{
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
		setContentView(new ImageFileView(this));
	}
}

test119_04.png
これでSDカード上にjpgファイルを2つ配置してから実行すると、起動時は/sdcard/test.jpgが読み込まれ表示、画面をタッチすると、、、

test119_05.png
/sdcard/test2.jpgが表示された。




プロジェクトファイルをダウンロード


カテゴリー「android」 のエントリー