質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

918閲覧

スケーリングの仕方がわからない。pxではなくdpで管理したい。

javava

総合スコア19

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/04/11 07:29

編集2018/04/11 22:21

前提・実現したいこと

javaでアンドロイドアプリを作っています。
やりたいことはどの端末にも合うように画像の大きさ、座標の動く量など、比率を同じにしたいです。
ここを参考にしました
言葉の意味は大体理解できたと思います。
ただそれを実装しろと言われたらお手上げでした。
今回の場合x-dpiやxx-dpiに画像を入れる、layoutファイルを使って作る等はなしで、単純にプログラミングで計算してやり遂げたいです。

試したこと

ある一つの実機のディスプレイサイズを基準とし、ほかのディスプレイサイズと比較しその倍率を画像や座標に掛け算するという方法をとりました。
しかしこれだと必要以上に画像が小さくなったり、大きくなったりします。
dpの世界ならそれが実現可能とどのサイトを見ても書いてあるのですが、実際どうすればいいのでしょうか?

このようになってしまうので
イメージ説明

このようにしたい
イメージ説明

要はxmlでmatch_parentするとどの画面でもフィットしてくれるじゃないですか。
それをプログラムで実現したいです。

float dp; public Graphics(SerfaceHolder holder, Activity activty){ dp = activity.getResources().getDisplayMetrics().density; } //ビットマップの描画 public void drawBitmap(Bitmap bitmap, float x, float y, int revers) { Matrix matrix = new Matrix(); if (canvas == null) return; while (bitmap != null) { float w = bitmap.getWidth(); float h = bitmap.getHeight(); float sx = x; if (revers == 1) { sx = x; } if (revers == -1) { sx = x + w; } matrix.setScale(revers * (dp), 1 * (dp)); matrix.postTranslate( sx * (dp), y * (dp)); canvas.drawBitmap(bitmap, matrix, paint); break; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

dpの世界ならそれが実現可能とどのサイトを見ても書いてあるのですが

どうでしょう?
360dp x 640dpが主流だったころは
昔は割とこれで何とかなったりしました

最近は410dpのものがGoogleからも出ているので
360dpと410dpでは当然余白の違いがでるでしょう
リンク内容

余白を気にするのはまた別の意味でも無理が出ます
画面にはStatus barやNavigation bar, Title barがあるのでそれも加味しないといけなくなるので
最初から全画面表示にしていればいいのですが

あらかじめ自分のサイズ(360x640, 410x730など)を決めて、余分な余白は黒背景(あるいはただの背景の延長)で無視するなどのやり方を取らないとうまくできないでしょう

投稿2018/04/13 02:14

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javava

2018/04/13 02:47

回答ありがとうございます。 すいません回答してもらった内容とは異なるんですけど、原因を調べていったところ画像の大きさは勝手にそのデバイスに合わせてくれていたみたいで、その上から上記のdp処理を重複させて掛けていたみたいなんですけど、そういうことってあるんですか? それともsurfaceholderで自分がなんかセットしちゃっているんですか?
aja

2018/04/13 04:35

こういうのが入っていれば // 画面に合わせて拡大・縮小 Canvas.scale(scale, scale)
javava

2018/04/13 06:16

そういったのはなかったです。 setPixelFormatかsetFixedあたりが怪しそうですがそれを抜いてコンパイルしてもなにも変わりませんでしたし、よくわかりませんでした。 すいません、わざわざ回答頂いたんですが、題名の答えとしてはabs123が適切と思いベストアンサーにしました。
kakajika

2018/04/13 06:32 編集

横入り失礼します。画像ファイルはres/drawableもしくはres/drawable-**dpi以下に置いてあるものからBitmapに読み込んだものですよね?その場合、読み込みの時点で画像の置いてあるディレクトリの**dpi部分を基準にして端末のdpiと比較し、サイズが調整された画像として読み込まれます。(res/drawableに置いてある場合はmdpiとして扱われます。)この機能を無効にした状態で画像を読み込みたいなら、res/drawable-nodpi以下に画像ファイルを置けばOKです。
javava

2018/04/14 00:28

そういうことだったんですか! ありがとうございます。 こんな初歩的なことをしていないとは他の回答者の方も思わなかったでしょうね… いやーありがとうございます。 一応drawableに対応させて処理を書き直したんですが、mdpi以下に画像をいれた方が今後メリットがあるですか?
javava

2018/04/14 00:30

あ、間違えましたno-dpでした
kakajika

2018/04/14 04:49 編集

いえいえ、意外とこのことを知らない方もいらっしゃると思いますよ。 drawable-nodpiに画像を置くと、Bitmapにした時にそのままのサイズで読み込まれるのでメモリの使用を減らせるというメリットはあります。画面のdensityに合わせて拡大縮小したものを使いたいのであればdrawable/drawable-**dpiの方が手間が少なくベターかと思います。
javava

2018/04/15 01:52

Kakajikaさんありがとうござました。 ajaさんもありがとうございました。
guest

0

ベストアンサー

Java

1float dp = 200; 2int px1 = (int)(dp * getResources().getDisplayMetrics().density); 3int px2 = (int) TypedValue.applyDimension( 4 TypedValue.COMPLEX_UNIT_DIP, 5 dp, 6 getResources().getDisplayMetrics());

リソースファイルで管理したければ

xml

1<?xml version="1.0" encoding="utf-8"?> 2<resources> 3 <dimen name="hoge_hoge">200dp</dimen> 4</resources>

Java

1int px2 = TypedValue.complexToDimensionPixelSize( 2 R.dimen.hoge_hoge, 3 getResources().getDisplayMetrics());

投稿2018/04/11 10:48

編集2018/04/11 10:50
abs123

総合スコア1280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javava

2018/04/11 13:03

回答ありがとうございます。 自分は上の方法で行ったのですが、この方法なら座標の管理は2倍、3倍としていけばできるとおもいます。 しかしこの方法だと画像が結局必要以上に2倍、3倍と大きくなるだけなのですが... (getResources().getDisplayMetrics().density) この部分を抽出して調べたところ、自分は2dpと3dpの実機で開発しているみたいです。 そこで3dpを基準に画像を作る際、画面いっぱいに表示されている画像があるとするじゃないですか。 それをもう一つの2dpの実機で開発すると単純に2/3で0.6倍になって、画面いっぱいに表示されていた画像が小さくなってかなり余白ができてしまうんです。 これを2dpの実機でも(極力画面いっぱい)にはみ出さない程度にしたいのですが... なんか変なこと言ってるかもしれませんがすいません。 ついでにBitmapに入れて使っていて、Matrixを使い 画像の大きさ変換はsetScale、座標変換はsetTranslateを使っていて、各々のXとYに倍率を掛けています。 すいません、なんかそりゃそうだろみたいなことを言っている気がするのですが、何とかなりませんかね?
abs123

2018/04/11 14:28

DisplayMetricsのxdpi,ydpiから縦横のピクセル数が取れるので、(フルスクリーン時のですが) それ使えばあとは比率で行けるような気がします。
javava

2018/04/11 22:23

コード載せたので見てもらっていいですか? 画像はこのクラスで管理しています。使いたいときはこのメソッドを呼びます なにか変ですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問