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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

2回答

3575閲覧

canvasが取得できません。何故かnullになってしまいます。

giant

総合スコア132

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/09/18 12:45

編集2017/09/18 12:53

下のようなコードで、canvas = surfaceHolder.lockCanvas();をしています。
surfaceholderは、nullではありません。しかし、cannvasがnullになってしまいます。
何故なのでしょうか?

java

1 public void drawFace(Rect rect1, int color) { 2 3 FaceLine faceline=new FaceLine(); 4 surfaceHolder =faceline.getSurfaceHolder(); 5 Paint paint = new Paint(); 6 7 if(surfaceHolder!=null){ 8 Log.e(TAG,"surfaceHolderはnullじゃない"); 9 } 10 11 try { 12 13 if (mSurfaceView != null) { 14 Log.e(TAG, "surfaceViewはnullじゃない"); 15 } else if (mSurfaceView == null) { 16 Log.e(TAG, "surfaceViewはnull"); 17 } 18 19 //この、surfaceHolderの前に文字を入れる 20 canvass = mSurfaceView.surfaceHolder.lockCanvas(); 21 if(canvass==null) { 22 Log.e(TAG, "canvassはnullだった"); 23 }else if (canvass != null) { 24 Log.e(TAG,"canvassはnullじゃない"); 25 26 try { 27 //canvass.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 28 paint.setColor(color); 29 //paint.setARGB(128, 255, 0, 0); 30 Log.e(TAG,"drawFaceの処理の中"); 31 canvass.drawRect(rect1,paint); 32 33 34 } finally { 35 Log.e(TAG,"drawFaceが呼ばれてる、finally"); 36 mSurfaceView.surfaceHolder.unlockCanvasAndPost(canvass); 37 } 38 } 39 40 } catch (IllegalArgumentException e) { 41 Log.w(TAG, e.toString()); 42 } 43 } 44

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

SurfaceView等の準備が整う前にlockCanvas()を呼び出すとnullが帰ってくることがあります。

何でもかんでもすぐに質問として投稿しすぎではないですか?
過去の質問を検索したり、ウェブで検索していますか?
この手の「方法はあっているはずなのに何故か動かないという質問」を実行環境の無い回答者に質問を投げかけるのはとても非効率ですよ。

投稿2017/09/18 17:34

yona

総合スコア18155

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

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

giant

2017/09/19 03:54

while(true) { //ここから //この、surfaceHolderの前に文字を入れる canvass = mSurfaceView.surfaceHolder.lockCanvas(); if (canvass == null) { Log.e(TAG, "canvassはnullだった"); //ここまでを繰り返すようにする continue; }else{ break; //nullじゃなければ、次に進める } } このようにしたのですが、一向に取得できません。
giant

2017/09/19 03:57

できるだけ情報を記載したいのですが、surfaceCreatedや、surfaceChanged、などは呼ばれていない状況です。それが原因なのでしょうか?申し訳ありません。
yona

2017/09/19 05:37

それが原因だと思いますよ。 基本的な使い方から学び直した方が良さそうですね。
giant

2017/09/19 07:56

わかりました。SurfaceHolder.CallbackをFragmentで、implementするように変更したのですが一向に呼び出されませんがいろいろ調べてみます。
giant

2017/09/20 11:10

ありがとうございます。 private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; FrameLayout frameLayout =(FrameLayout)view.findViewById(R.id.framelayout); frameLayout.addView(mSurfaceView, 0, new FrameLayout.LayoutParams(WC, WC)); これで解決しました。
guest

0

Canvasは排他制御されるものです。いつでも獲得できるものではなく、プログラムの状況によってはできないことがあります。だからコーディングする場合には獲得できなかったときを想定して作るのが定石です。

そこを理解して抑えておかなければどうしようもない話ではないでしょうか。質問のコードでnullが帰っているのは起こるべくして起きているのでしょうし、それに対して何故も何もありません。

投稿2017/09/18 22:52

keicha_hrs

総合スコア6766

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

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

giant

2017/09/19 03:54

while(true) { //ここから //この、surfaceHolderの前に文字を入れる canvass = mSurfaceView.surfaceHolder.lockCanvas(); if (canvass == null) { Log.e(TAG, "canvassはnullだった"); //ここまでを繰り返すようにする continue; }else{ break; //nullじゃなければ、次に進める } } このようにしたのですが、一向に取得できません。
keicha_hrs

2017/09/19 15:49 編集

SurfaceViewの描画を実際に進めるのは、Androidフレームワークの層が担う処理です。これではフレームワークに処理が一切返りませんから、いつまで経ってもロックできません。申し訳ないけど考え方としては最悪のパターンです。 Androidに限らず、フレームワークがイベントを投げてユーザープログラムはそれを受け取って処理をするタイプのプラットフォーム(OS)上でのプログラミングは、投げられたイベントの処理(Androidで言えばonCreateとか)は「迅速に処理を終えて返す」のが大原則です。そういうプログラミングにまだ慣れていないのは仕方ないですが、様々なサンプルプログラムでケーススタディを深めるしかないでしょうね。
giant

2017/09/20 09:50

SurfaceVIewのcallbackして自動で呼び出される処理はViewのクラスに書き込み、getHolder()や、canvas = surfaceHolder.lockCanvas();も、Viewのクラスで処理するようにしたのですが、何故かViewCreatedなどが呼ばれません。 本のサンプルの通りに変更したのですが何故なのでしょうか?
giant

2017/09/20 11:10

ありがとうございます。 private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; FrameLayout frameLayout =(FrameLayout)view.findViewById(R.id.framelayout); frameLayout.addView(mSurfaceView, 0, new FrameLayout.LayoutParams(WC, WC)); これで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問