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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

5389閲覧

canvasのサイズをフルスクリーンにしたい。

sunmo

総合スコア10

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2018/08/07 15:14

編集2018/08/17 17:39

AndroidのアプリでService上に配置したボタンをタップすると、画面のキャプチャをとり、特定の箇所に
DrawRectで矩形を付けたいのですが、スクリーン上のすべての領域を使用できず、
右端のエリアになると矩形が欠けて表示できないエリアがありました。

調べてみると、キャプチャで取得したbitmapのサイズとcanvasのサイズが異なることに気が付きました。
DrawRectでcanvasサイズを指定すると、やはり、右端部分に届いていませんでした。

サイズは下記の通りです。

画面サイズ:1080×1920
bitmapサイズ:1080×1794
canvasサイズ:840×1730

上記について、canvasサイズをbitmapサイズまたは画面サイズにすることはできますでしょうか?
どなたかご教示お願いいたします。

該当のソースコード

java

1package com.example.sumsu.overlaytest2; 2 3import android.content.Context; 4import android.graphics.Canvas; 5import android.graphics.Color; 6import android.graphics.Paint; 7import android.graphics.Rect; 8import android.util.AttributeSet; 9import android.util.DisplayMetrics; 10import android.view.View; 11import android.view.WindowManager; 12 13public class AnalyzeResultView extends View { 14 15 private Rect rect = null; 16 private Paint mPaint = new Paint(); 17 private int displayWidth ; 18 private int displayHeight ; 19 20 public AnalyzeResultView(Context context) { 21 super(context); 22 } 23 24 public AnalyzeResultView(Context context,AttributeSet attrs) { 25 super(context,attrs); 26 } 27 28 public AnalyzeResultView(Context context, AttributeSet attrs, int defStyle){ 29 super(context, attrs, defStyle); 30 } 31 32 // 結果をセットし描画を更新するためのメソッド 33 public void setAnalyzeResult(Rect rect) { 34 this.rect = rect; 35 36 postInvalidate(); 37 } 38 39 /*@Override 40 protected void onLayout(boolean changed, int l, int t, int r, int b) { 41 42 invalidate(); 43 }*/ 44 45 @Override 46 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 47 super.onMeasure(widthMeasureSpec, heightMeasureSpec); 48 49 // 画面の縦横サイズとdpを取得 50 WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); 51 DisplayMetrics displayMetrics = new DisplayMetrics(); 52 if(wm != null) { 53 wm.getDefaultDisplay().getMetrics(displayMetrics); 54 } 55 displayWidth = displayMetrics.widthPixels; 56 displayHeight = displayMetrics.heightPixels; 57 58 setMeasuredDimension(displayWidth,displayHeight); 59 60 } 61 62 63 @Override 64 public void onDraw(Canvas canvas) { 65 super.onDraw(canvas); 66 67 68 if(rect != null) { 69 70 //描画のペイント定義 71 mPaint.setAntiAlias(true); 72 mPaint.setStrokeWidth(12); 73 mPaint.setStyle(Paint.Style.STROKE); 74 mPaint.setColor(Color.BLUE); 75 76 // 矩形の描画処理... 77 canvas.drawRect(rect, mPaint); 78 } 79 } 80 81} 82

xml

1activity_main.xml 2 3<?xml version="1.0" encoding="utf-8"?> 4<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 5 xmlns:app="http://schemas.android.com/apk/res-auto" 6 xmlns:tools="http://schemas.android.com/tools" 7 android:layout_width="match_parent" 8 android:layout_height="match_parent" 9 tools:context=".MainActivity"> 10 11 <Button 12 android:id="@+id/button" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:layout_marginStart="8dp" 16 android:layout_marginTop="8dp" 17 android:onClick="button1_click" 18 android:text="@string/btnStart" 19 app:layout_constraintStart_toStartOf="parent" 20 app:layout_constraintTop_toTopOf="parent" /> 21 22 <Button 23 android:id="@+id/button2" 24 android:layout_width="wrap_content" 25 android:layout_height="wrap_content" 26 android:layout_marginStart="8dp" 27 android:layout_marginTop="8dp" 28 android:onClick="button2_click" 29 android:text="@string/btnEnd" 30 app:layout_constraintStart_toStartOf="parent" 31 app:layout_constraintTop_toBottomOf="@+id/button" /> 32</android.support.constraint.ConstraintLayout>

xml

1overlay.xml 2 3<?xml version="1.0" encoding="utf-8"?> 4<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 5 xmlns:app="http://schemas.android.com/apk/res-auto" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent"> 8 9 <com.example.sumsu.overlaytest2.AnalyzeResultView 10 android:id="@+id/ResultView" 11 android:layout_width="match_parent" 12 android:layout_height="match_parent" /> 13</LinearLayout>

xml

1overlay2.xml 2 3<?xml version="1.0" encoding="utf-8"?> 4<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 5 android:id="@+id/linearLayout" 6 android:layout_width="wrap_content" 7 android:layout_height="wrap_content" 8 android:gravity="top|left" 9 android:orientation="vertical"> 10 11 <LinearLayout 12 android:id="@+id/linearLayout1" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:orientation="horizontal"> 16 17 <Button 18 android:id="@+id/start" 19 android:layout_width="match_parent" 20 android:layout_height="wrap_content" 21 android:layout_weight="1" 22 android:background="#99FF0000" 23 android:text="Start" /> 24 25 <Button 26 android:id="@+id/stop" 27 android:layout_width="match_parent" 28 android:layout_height="wrap_content" 29 android:layout_weight="1" 30 android:background="#9900ff00" 31 android:text="Stop" /> 32 33 </LinearLayout> 34 35</LinearLayout>

試したこと

2018/08/08 18:07追記
onMeasureを追加することで、Viewのサイズの変更ができました。
ただ、ナビゲーションバーとステータスバーのエリアは使用できませんでした。
こちらを使用することはできるのでしょうか?

2018/08/11 02:36追記
Viewのサイズを画面サイズ(getRealSize):1080×1920と同じにすると、
ステータスバーの下から矩形が描かれ、下側が表示できませんでした。
フルスクリーンにゲームなどを起動すると、ステータスバーが消えるため、矩形も上に詰まる形で
移動するのですが、下側の枠が描かれることはなく、矩形がそのまま上に移動するだけでした。
特定の箇所にマークを付けたいので、四角い枠を画面いっぱいに表現したいのですが、できないものでしょうか?
ご存知の方、ご教示ください。よろしくお願いいたします。
イメージ説明

2018/08/18 02:37追記
ナビゲーションバーに割り込むも半分まで・・・ステータスバーより上にずれて描画されました。
イメージ説明

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

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

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

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

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

kakajika

2018/08/08 08:17

レイアウトのソース(およびxml)も貼っていただいた方がいいように思います。単にmarginを設定してしまっているとかではないでしょうか?
sunmo

2018/08/08 08:58

kakajikaさん、再度ありがとうございます。そしてご指摘ありがとうございます。先ほど少し進展があり、カスタムViewの中で、onMeasureでサイズを指定できることを知り、試したところ、サイズの変更ができました。ただ、ナビゲーションバー、ステータスバーのエリアは表示できませんでした。こちらは可能なのでしょうか?XMLなどはこのあと記載いたします。
guest

回答2

0

ベストアンサー

前回のご質問 の続きとして回答します。(今回のご質問ではService側のコードが省略されていて他のコードとの繋がりがよくわからないので、省略するならば前回のご質問への参照をちゃんと明示するべきです。)

前回のコードでWindowManager.LayoutParamsを生成している箇所がありましたが、おおむね原因はここにあります。

java

1params = new WindowManager.LayoutParams( 2 WindowManager.LayoutParams.WRAP_CONTENT, 3 WindowManager.LayoutParams.WRAP_CONTENT, 4 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, 5 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 6 WindowManager.LayoutParams.FLAG_FULLSCREEN | 7 WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 8 PixelFormat.TRANSLUCENT);
  • オーバーレイ(AnalyzeResultView)のサイズがWindow全体に広がらない件について

↑のLayoutParamsのサイズ指定で WindowManager.LayoutParams.WRAP_CONTENT を使っているのが原因でしょう。 WindowManager.LayoutParams.MATCH_PARENT を使えばWindow全体に広がります。
ただし、Windowのサイズはナビゲーションバーを含めたものにはできないので、それも考慮するとWRAP_CONTENTの方がよさそうです(後述します)。

  • システムバー上への描画について

まず、オーバーレイの描画領域をシステムバー上にまで広げるためには、Windowのレイアウトフラグを指定する必要があります。これはWindowManager.LayoutParamsの生成時に指定可能です。

java

1params = new WindowManager.LayoutParams( 2 WindowManager.LayoutParams.WRAP_CONTENT, 3 WindowManager.LayoutParams.WRAP_CONTENT, 4 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, 5 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 6 WindowManager.LayoutParams.FLAG_FULLSCREEN | 7 WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 8 WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | 9 WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | 10 WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 11 PixelFormat.TRANSLUCENT);

これでシステムバー上への描画が可能になりますが、Windowのサイズはステータスバーを含めた領域までしか広がりません。なのでナビゲーションバー上への描画も行いたい場合はご質問に書かれていた方法の通りで、 onMeasure 内でgetRealSizeにより取得したサイズを指定してあげる必要があります。(WindowManager.LayoutParamsのheightで直接値を指定してしまう方法もありますが、画面回転も考慮するとWRAP_CONTENTにしておいてonMeasureで計算するのがよさそうです)

まとめると、

  1. WindowManager.LayoutParamsのレイアウトフラグを指定する
  2. onMeasureで画面全体のサイズをViewのサイズに設定する

の2点をやればOKです。

簡単に試してみたスクリーンショットを載せておきます。

スクリーンショット

投稿2018/08/11 05:34

編集2018/08/11 05:37
kakajika

総合スコア3131

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

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

sunmo

2018/08/11 14:39 編集

詳しい情報ありがとうございます。私のやり方が悪いのか現象が変わらずなので、ほかのソースもアップしようと思ったのですが、文字数制限であげれずでした。 見にくくて申し訳ありませんが、下記に一部不安なソースをアップしました。何か原因わかりますでしょうか? 画面に矩形を表示しますが、その下の画面にはタッチを通したいため、overlayとoverlay2で分けてoverlay2側にカスタムViewを追加しています。扱い方が悪いのかと思うのですが、ほかに情報が必要でしたらご要望ください。 public class LayerService extends Service { ~省略~ public void overlayView() { WindowManager.LayoutParams params1,params2; params1 = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); params2 = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); // 中央上に配置 params1.gravity= Gravity.TOP | Gravity.CENTER; params1.x = 20 * dpScale; // 20dp params1.y = 80 * dpScale; // 80dp // 左上に配置 //params2.gravity= Gravity.TOP | Gravity.LEFT; //params2.x = 0; //params2.y = 0; LayoutInflater layoutInflater = LayoutInflater.from(this); overlayView = layoutInflater.inflate(R.layout.overlay, null); View.OnClickListener buttonClickListener = new View.OnClickListener() { @Override public void onClick(View view1) { switch(view1.getId()) { case R.id.start: // 画面の縦横サイズとdpを取得 DisplayMetrics displayMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(displayMetrics); screenDensity = displayMetrics.densityDpi; //displayWidth = displayMetrics.widthPixels; //displayHeight = displayMetrics.heightPixels; //ハードウェアサイズ取得 hardwareWidth = MainActivity.hardwareWidth; hardwareHeight = MainActivity.hardwareHeight; imageReader = ImageReader.newInstance( hardwareWidth, hardwareHeight, PixelFormat.RGBA_8888, 1); virtualDisplay = MainActivity.mProjection.createVirtualDisplay("ScreenCapture", hardwareWidth, hardwareHeight, screenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, imageReader.getSurface(), null, null); //スクリーンショット取得 Bitmap btMap = getScreenshot(); BitmapAnalyze test = new BitmapAnalyze(); Rect rect1; rect1 = test.AreaKettei(btMap); AnalyzeResultView resultView = overlayView.findViewById(R.id.ResultView); resultView.setAnalyzeResult(rect1); break; case R.id.stop: Intent intent2 = new Intent(getApplication(), MainActivity.class); startActivity(intent2); break; } } }; overlayView.findViewById(R.id.start).setOnClickListener(buttonClickListener); overlayView.findViewById(R.id.stop).setOnClickListener(buttonClickListener); wm.addView(overlayView, params1); overlayView = layoutInflater.inflate(R.layout.overlay2, null); wm.addView(overlayView, params2); }
sunmo

2018/08/11 14:55

まとめていただいた下記についてですが、それぞれ下記のように対応しております。 >1.WindowManager.LayoutParamsのレイアウトフラグを指定する  ⇒上記ソースのようにしています。 >2.onMeasureで画面全体のサイズをViewのサイズに設定する  ⇒現状は、MainActivityのonWindowFocusChangedの中で、getRealSizeなどを使って、   ハードウェア、ディスプレイ、Viewの大きさをパブリック変数に保存して、   カスタムViewのonMeasureの中で下記2行を追加しているだけです。   super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(MainActivity.hardwareWidth, MainActivity.hardwareHeight);
sunmo

2018/08/15 15:00

一度新規プロジェクトを作成しなおし、ハードウェアサイズの1080×1920だけの枠を描画するプログラムを作ってみたところ、ステータスバーには表示はできましたが、やはり、ナビゲーションバー上には表示できず、バーの裏に隠れた感じ(途切れた感じ)になりました。 試しにもう一つご記載いただいたWindowManager.LayoutParamsのheightに直接1920をセットする方法を試すと、ナビゲーションバー上には半分ほど食い込むことはできたのですが、一番したまでは描画できず、画面全体的に上に移動した感じとなり、スタータスバー側が欠けたイメージになりました。 kakajika様が実現されている方法をご教授いただけないでしょうか?
kakajika

2018/08/16 21:38

すみません、肝心なところの説明が抜けてました。onMeasureを実装する必要があるのは、Windowに追加しているViewそのものの方です。ご質問のコードの場合はR.layout.overlayがそれに当たります。その中にあるAnalyzeResultViewのonMeasureをいじっただけでは、オーバーレイの描画領域は広がらないと思います。 gistに自分の試したコードを上げておきましたので、参考にしてください。 https://gist.github.com/kakajika/973667ccc945a1ad10e6eba0cef0f793 Kotlinで書いたものをそのまま上げてますが、わかりにくいところがあったらJavaに直しますので言ってください。
sunmo

2018/08/17 17:49

ソースありがとうございます。Kotlinは慣れていなくわからないことだらけなのですが、見る限りでは、OverlayDrawingView とFullscreenOverlayLayout の2つのカスタムViewを追加されていて、FullscreenOverlayLayoutの中にOverlayDrawingView を配置し、FullscreenOverlayLayoutの中でonMeasureされているように見えます。またその時、onMeasureの中では、WindowManagerを使って、サイズを取得し、super.onMeasureにそのサイズをセットしているように見えます。 同じように記載したつもりなのですが、結果が同じになりました。結果を「試してみたこと」として追加してみました。念のため、ご確認いただけますでしょうか?ソースを見てもらいたいとは思うのですが、gitHubも使用したことがないので、敷居が高く思っています。良い方法があれば教えてください。
kakajika

2018/08/17 22:28

コードについての認識は大体あっていると思います。FullscreenOverlayLayoutが必要な理由は上のコメントに書いています。一応、gistの方にJavaで置き換えたコードも上げておきました。 追記について: 実際のコードを見ないことにはなんとも言えませんが、layoutParamsのgravityの設定が抜けてしまっているとかではないでしょうか?Windowの本来の高さよりも大きなものを表示しようとしているわけなので、Gravity.TOPを指定しないと上にずれてしまいます。
sunmo

2018/08/18 13:21

ありがとうございます。できました!Gravity.TOPが必要だったのですね!配置だけと思っていたので、全体の配置に影響しているとは思わず、途中で削除してしまっていました。これでまた一歩進むことができました。
guest

0

画面サイズ:1080×1920

bitmapサイズ:1080×1794
canvasサイズ:840×1730

横幅は解決できているものとして
縦サイズに注目すると

フィジカルが画面縦サイズ:1920
bitmapサイズ:1794
canvasサイズ:1730
こちらのシミュレーションでは
リンク内容

Pixel2
canvasサイズ + Status bar = bitmapサイズ
1730 + 64 = 1794

bitmapサイズ + Navigation bar = 画面サイズ
1794 + 126 = 1920

ということでStatus barとNavigation Barの部分が表示されていないと思われます

フルスクリーンで表示にするには
Manifestとstyleで設定するとか
リンク内容

あるいはコードでもできます

@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus && Build.VERSION.SDK_INT >= 19) { hideSystemUI(); } } private void hideSystemUI() { View decorView = getWindow().getDecorView(); decorView.setSystemUiVisibility( View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN ); }

これを追加すれば可能です。やってみてください
リンク内容

投稿2018/08/11 01:39

aja

総合スコア3733

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

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

sunmo

2018/08/11 14:43

ajaさん、コメントありがとうございます。上記の方法(Manifestとソース)、私も見つけて試してみたのですが、現象変わらずでした。せっかく情報提供いただいたのにご期待に沿えず申し訳ありません。 もしほかにお気づきの点がありましたら、ご指摘ください。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問