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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひよつこ

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

#1

投稿記事 by ひよつこ » 12年前

いつもお世話になっています。ひよつこです。
早速ですが質問させていただきます。

今回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の描画は正しく行われていますが、
なぜかリサイズされないのです。

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 12年前

APIの仕様をよく覚えていないですが、
このコードだけだとせっかくリサイズしたresultを捨てているように見えます。
もう少し広い範囲のコードを貼っていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ひよつこ

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

#3

投稿記事 by ひよつこ » 12年前

返信ありがとうございます。
コードを省略したことで訳のわからない質問になってしまい済みません。

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();
上記のコードが正しいものです。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 12年前

scaleX、scaleYを計算するときにint型の値同士を割り算しているので、結果は切り捨てられるはずです。

コード:

        float scaleX = (float)mWidth / (float)res.getWidth();
        float scaleY = (float)mHeight / (float)res.getHeight();
としてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ひよつこ

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

#5

投稿記事 by ひよつこ » 12年前

返信ありがとうございます。
floatを使ってみたら上手くいきました。
ありがとうございました。
次回もよろしくお願いします。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#6

投稿記事 by ISLe » 12年前

デジャヴ…

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

閉鎖

“C言語何でも質問掲示板” へ戻る