ページ 11

[Android]SurfaceViewの大きさにリサイズ

Posted: 2013年11月09日(土) 12:47
by ひよつこ
いつもお世話になっています。ひよつこです。
早速ですが質問させていただきます。

今回SurfaceViewの大きさに合わせてリサイズしたBitmapを
SurfaceViewの中央に描画したいと思っています。

コード:


private int mWidth;	//SurfaceViewの幅
private int mHeight;	//SurfaceViewの高さ

private Bitmap prepareImage(Bitmap res){
	Bitmap result = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
	float scaleX = mWidth / res.getWidth();
	float scaleY = mHeight / res.getHeight();
	Matrix m = new Matrix();
	if(scaleX < scaleY){
		m.preScale(scaleX, scaleX);
		m.postTranslate(0, (mHeight - (res.getHeight() * scaleX) ) / 2);
	}else if(scaleX > scaleY){
		m.preScale(scaleY, scaleY);
		m.postTranslate((mWidth - (res.getWidth() * scaleY) ) / 2, 0);
	}else{
		m.postScale(scaleX, scaleY);
	}
	Canvas canvas = new Canvas(result);
	canvas.drawBitmap(res, m, new Paint());
	return result;
}
上記のコードをSurfaceView内に記述し、Activityから

コード:

Bitmap bmp = BitmapFactory.createBitmap("ファイルのパス");
surface.prepareImage(bmp);
surface.doDraw();
のように実行します。
しかしSurfaceViewの描画は正しく行われていますが、
なぜかリサイズされないのです。

コードの抜粋で済みませんが、
原因を教えていただけると助かります。
よろしくお願いします。

Re: [Android]SurfaceViewの大きさにリサイズ

Posted: 2013年11月09日(土) 15:24
by みけCAT
APIの仕様をよく覚えていないですが、
このコードだけだとせっかくリサイズしたresultを捨てているように見えます。
もう少し広い範囲のコードを貼っていただけますか?

Re: [Android]SurfaceViewの大きさにリサイズ

Posted: 2013年11月10日(日) 17:58
by ひよつこ
返信ありがとうございます。
コードを省略したことで訳のわからない質問になってしまい済みません。

SurfaceViewの方

コード:

	private int mWidth; //SurfaceViewの幅
	private int mHeight;    //SurfaceViewの高さ
	private Bitmap Image;

	private Bitmap prepareImage(Bitmap res){
		Bitmap result = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
		float scaleX = mWidth / res.getWidth();
		float scaleY = mHeight / res.getHeight();
		Matrix m = new Matrix();
		if(scaleX < scaleY){
			m.preScale(scaleX, scaleX);
			m.postTranslate(0, (mHeight - (res.getHeight() * scaleX) ) / 2);
		}else if(scaleX > scaleY){
			m.preScale(scaleY, scaleY);
			m.postTranslate((mWidth - (res.getWidth() * scaleY) ) / 2, 0);
		}else{
			m.postScale(scaleX, scaleY);
		}
		Canvas canvas = new Canvas(result);
		canvas.drawBitmap(res, m, new Paint());
		return result;
	}

	public void setImage(Bitmap _image){
		Image = _image;
	}

	public void doDraw(){
		SurfaceHolder holder = getHolder();
		Canvas canvas = holder.lockCanvas();
		canvas.drawColor(0xff000000);
		canvas.drawBitmap(Image, new Matrix(), new Paint());
		holder.unlockCanvasAndPost(canvas);
	}
Activityの方

コード:

	Bitmap bmp = BitmapFactory.createBitmap("ファイルのパス");
	surface.setImage(surface.prepareImage(bmp));
	surface.doDraw();
上記のコードが正しいものです。
よろしくお願いします。

Re: [Android]SurfaceViewの大きさにリサイズ

Posted: 2013年11月11日(月) 21:48
by みけCAT
scaleX、scaleYを計算するときにint型の値同士を割り算しているので、結果は切り捨てられるはずです。

コード:

        float scaleX = (float)mWidth / (float)res.getWidth();
        float scaleY = (float)mHeight / (float)res.getHeight();
としてみてください。

Re: [Android]SurfaceViewの大きさにリサイズ

Posted: 2013年11月16日(土) 16:13
by ひよつこ
返信ありがとうございます。
floatを使ってみたら上手くいきました。
ありがとうございました。
次回もよろしくお願いします。

Re: [Android]SurfaceViewの大きさにリサイズ

Posted: 2013年11月16日(土) 17:31
by ISLe
デジャヴ…

Matrixだけを保持すれば良い気がしてならないです。