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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

3回答

4206閲覧

android drawRectの座標位置がおかしい 画面サイズを取得する二は?

masaakitsuyoshi

総合スコア102

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2016/04/22 07:45

編集2016/04/23 12:07

ブロック崩しを作っています。
ボールが描画できたので、バーを描画したいです。

表示させること自体はできたのですが、位置がおかしいです。

座標でいうと、(0,0)の位置に表示されてしまいます。

bar = new Bar( view_w/2 , view_h - 100 );

canvas.drawRect(bar.x, bar.y, 180, 10, paint);

bar = new Bar(500,500);

と引数を数字にするとバーも移動するのですが、画面サイズの違うスマホでも同じような位置に表示させたいので、画面サイズを取得して、変数に入れ、それをdrawRectの引数に使いたいです。

ちなみに、こちらを参考にしました。
リンク内容

リンク先ではOverrideされたsurfaceChangedの中に

view_w = width;
view_h = height;

があります。
Changedの中にあるのがいけないのかな?
と思い
surfaceCreatedの中に移動させても変わりませんでした。

Main

package com.example.blockbreak; ----中略---- public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //カスタムビュークラスのインスタンスをコンテントにセット setContentView(new CustomView(this)); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } class CustomView extends SurfaceView implements SurfaceHolder.Callback, Runnable { //スレッドクラス Thread mainLoop = null; // 描画用 Paint paint = null; Paint paint2 = null; Paint paint3 = null; // 円のX,Y座標 private int circleX = 50; private int circleY = 50; private int circle2X = 30; private int circle2Y = 30; // 円の移動量 private int circleVx = 15; private int circleVy = 15; private int circle2Vx = 8; private int circle2Vy = 15; Bar bar; //バー private float touch_x; // タッチされたx座標 int view_w, view_h; // SurfaveViewの幅と高さ //コンストラクタ public CustomView(Context context) { super(context); // SurfaceView描画に用いるコールバックを登録する。 getHolder().addCallback(this); // 描画用の準備 paint = new Paint(); paint2 = new Paint(); paint3 = new Paint(); paint.setColor(Color.RED); paint2.setColor(Color.CYAN); paint3.setColor(Color.GREEN); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO 今回は何もしない。 view_w = width; view_h = height; } // SurfaceView生成時に呼び出されるメソッド。 @Override public void surfaceCreated(SurfaceHolder holder) { // 背景 Canvas canvas = holder.lockCanvas(); canvas.drawColor(Color.BLACK); holder.unlockCanvasAndPost(canvas); // スレッド開始 mainLoop = new Thread(this); mainLoop.start(); touch_x = view_w/2; //バーを生成 bar = new Bar( view_w/2 , view_h - 100 ); } ----中略---- @Override public void run(){ while (true) { Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { canvas.drawColor(Color.BLACK); // 円1を描画する canvas.drawCircle(circleX, circleY, 20, paint); //円2を描画する canvas.drawCircle(circle2X,circle2Y,20,paint2); //長方形を描画する canvas.drawRect(bar.x, bar.y, 180, 10, paint); getHolder().unlockCanvasAndPost(canvas); ----中略---- } } } } }

Barクラス

package com.example.blockbreak; public class Bar { //表示座標 public float x; public float y; //バーのサイズ public final float half_size = 100; //コンストラクタ public Bar( int _x, int _y ){ //初期座標をセット x = (float)_x; y = (float)_y; } // 右移動 public void right(float touch_x){ x = touch_x - half_size; } // 左移動 public void left(float touch_x){ x = touch_x - half_size; } }

追記
surfaceCreated の中で
view_w = canvas.getWidth();
view_h = canvas.getHeight();
しても値が0だった。

runの中で行っても値が0だった。

barのインスタンス化をrunの中に移し、
view_w = canvas.getWidth();
view_h = canvas.getHeight();
したら値取得できた。

@Override public void run(){ while (true) { Canvas canvas = getHolder().lockCanvas(); if (canvas != null) { view_w = canvas.getWidth(); view_h = canvas.getHeight(); // バーを生成 bar = new Bar( view_w/2 , view_h - 100 ); //長方形を描画する canvas.drawRect( bar.x, bar.y , bar.x + 200 , bar.y + 20 , paint3);

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

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

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

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

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

dsuzuki

2016/04/22 08:10

view_w, view_hの値はどこで設定していますか? 提示されたコードでは、変数定義時の初期値(ゼロ)しか読めません。
masaakitsuyoshi

2016/04/22 09:55

surfaceChangedの引数にwidth, heightがあったのでこちらで定義したのですが、それでも初期値になっている?のでしょうか。
masaakitsuyoshi

2016/04/22 09:55

surfaceChangedの部分追記しました。
dsuzuki

2016/04/22 10:11

修正ありがとうございます。
guest

回答3

0

自己解決

canvas.getWidth
canvas.getHeight
というのでSurfaceViewの画面サイズを取得できる。

取得した値を適当な変数に入れる。

view_w, view_hに入れれば良い。

しかし、それだけだと値がなぜか0のままだった。

view_w = canvas.getWidth(); view_h = canvas.getHeight(); // バーを生成 bar = new Bar( view_w/2 , view_h - 100 );

barのインスタンス化をrunの中に移動させると、無事drawRectの引数に値がセットされた。(理由よくわからない)

投稿2016/04/23 12:12

masaakitsuyoshi

総合スコア102

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

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

0

surfaceCreatedの中でwidth,heightを表示してみてください。おそらく両方0のはずです。これは、
surfaceviewのライフサイクルが関係すると思われます。surfaceCreatedの中で画面サイズを取得したい場合、以下のようなコードで実現できます。だだし、これは画面全体のサイズでTitleBarや通知バーなども含まれてしまっているので、surfaceChanged内で取得できる画面サイズと異なる可能性があります。

java

1 Display display = getWindowManager().getDefaultDisplay(); 2 Point point = new Point(); 3 display.getSize(point); 4//point.x 画面幅 5//point.y 画面の高さ

投稿2016/04/22 08:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

masaakitsuyoshi

2016/04/23 11:24

//display.getSize(point); の時点では point(0,0) point.x =720 point.y = 1280 view_w= 0 view_h =0 となっていました。
guest

0

Canvas#drawRectの引数はleft,top,right,bottomです。
大小関係が矛盾していると0,0になったような気がします。

投稿2016/04/22 08:17

yona

総合スコア18155

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

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

masaakitsuyoshi

2016/04/22 09:59

そうなんですね! リファレンスではleft top right bottomと書いてましたが、 別のサイトでは drawRext(int x, int y, int width, int height) x y 座標と 四角形の横と高さ を示している、と書いてあり、混乱していました。
yona

2016/04/22 10:26

kotetuさんが回答しているとおり、view_w,view_hも怪しいので、drawRectの直前でログを出力して値を確認してください。
masaakitsuyoshi

2016/04/23 12:08

理屈がわかりませんが、barのインスタンス化する場所を変えたら正常に値が取得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問