今回はAndroid SDKでjpgファイルを読み込み、画面サイズに合わせて拡大縮小表示する。
まずは雛形となるプロジェクトをEasyProjectGenerator for Androidで作る。JavaのSimpleプロジェクトを利用した。
そして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); } }
上で実装した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)); } }
これでSDカード上にjpgファイルを2つ配置してから実行すると、起動時は/sdcard/test.jpgが読み込まれ表示、画面をタッチすると、、、
/sdcard/test2.jpgが表示された。
プロジェクトファイルをダウンロード