• 締切済み

drawとonDrawの使い分け

amanojaku1の回答

回答No.2

https://stackoverflow.com/questions/13640541/view-ondrawcanvas-c-versus-drawcanvas-c-in-android >The onDraw(Canvas c) is a override method and automatically called when the view is being rendered. Here you can do your additional drawing like make circles, lines or whatever you want. > >The draw(Canvas c) is used to manually render this view (and all of its children) to the given canvas. The view must have already done a full layout before this function is called. When implementing a view, implement onDraw(android.graphics.Canvas) instead of overriding this method. If you do need to override this method, call the superclass version. > >Or in simple words draw(Canvas c) is simply a function that is not automatically called when the view is rendered. User is needed to provide the canvas on which this view will rendered and user also have to do all the drawing on the canvas before calling this function. 下記は【Google 翻訳】ですが、少し編集してあります。 >onDraw(Canvas c)はオーバーライドメソッドであり、ビューがレンダリングされるときに自動的に呼び出されます。 ここでは、メークサークルや線などの追加図面を自由に作成できます。 > >Draw(Canvas c)は、このビュー(およびそのすべての子)を指定されたキャンバスに手動でレンダリングするために使用されます。 ビューは、この関数が呼び出される前に完全なレイアウトを既に完了している必要があります。 ビューを実装するときは、このメソッドをオーバーライドする代わりにonDraw(android.graphics.Canvas)を実装します。 このメソッドをオーバーライドする必要がある場合は、スーパークラスのバージョンを呼び出します。 > >または、単純な言葉でdraw(Canvas c)は、ビューがレンダリングされるときに自動的に呼び出されない関数です。 このビューをレンダリングするキャンバスを提供するにはユーザーが必要です。また、この関数を呼び出す前にキャンバス上のすべての描画を行う必要があります。 ざっくりと言うと、プログラマーが描画処理を記述する場合は、onDrawに記述しましょう、と言うことでしょう。 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);←「このメソッドをオーバーライドする必要がある場合は、スーパークラスのバージョンを呼び出します」 ここに描画処理を記述する } Android入門 アプリ開発の基本、ビューのライフサイクル(図解) https://www.ecoop.net/memo/archives/android_lifecycle_of_view.html

takahasi5634
質問者

補足

Draw(Canvas c)は、このビュー(およびそのすべての子)を指定されたキャンバスに手動でレンダリングするために使用されます。これが解らないのですが、手動ということはオーバーライドして自分で描画処理を描くということではないのでしょうか?しかし、それはonDrawでやるのですよね? あるライブラリをネットからダウンロードして解析しているのですが、FrameLayoutを継承したクラス、Viewを継承したクラスがあり、どちらもdrawをオーバーライドして描画処理をさせています。onDrawではありませんが、ちゃんと呼び出されています。どこにもdraw(canvas)のような呼び出しはありません。これは自動で呼び出されているわけではないのでしょうか?

関連するQ&A

  • Androidアプリ EditText表示

    main.xmlにGUIで作成したEditTextを、Canvasクラスを通じて表示させる方法はあるのでしょうか? Canvasクラス内にfindViewByIdで読み出してくるよう記述しましたが、実行しても反映されず困っております。 protected void onDraw(Canvas canvas) { (ここに記述) } ちなみに、テキストの描写は問題無く反映できます。 canvas.drawText(text, 4, 0, paint); よろしくお願いいたします。

    • ベストアンサー
    • Java
  • アンドロイド JAVA 警告

    アンドロイド 初心者です package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new testView(this)); } class testView extends View { public testView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { Paint paint = new Paint(); paint.setColor(Color.RED); canvas.drawLine(0, 0, 100, 50, paint); } } } このプラグラムで"Paint paint = new Paint();"のところで "Avoid object allocations during draw/layout operations (preallocate and reuse instead)" の警告が出ます、これを取る方法はありませんか。

    • ベストアンサー
    • Java
  • 画像の位置指定の数字を変えても、位置が変わりません! 何がいけないので

    画像の位置指定の数字を変えても、位置が変わりません! 何がいけないのでしょうか? package com.cute.yukari; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Bundle; import android.view.View; public class cutecreate extends Activity { private SampleView mView; private Bitmap mBitmap; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.yukari1 ); mView = new SampleView(this); setContentView(mView); } private class SampleView extends View { private Paint mPaint; private float imageX = 0f; private float imageY = 0f; public SampleView(Context context) { super(context); mPaint = new Paint(); } @Override protected void onDraw(Canvas canvas) { //画像表示 canvas.drawBitmap(mBitmap, imageX - mBitmap.getWidth() / 50, ←ここの数字を変えても25以降位置が変わりません。 imageY - mBitmap.getHeight() / 50, ←25より少なくすると多少は移動するのですが… mPaint); } } }

    • ベストアンサー
    • Java
  • Androidアプリ開発

    Androidアプリを開発しているのですが、 エミュレータ、実機ともに実行するとプログラムが反映されておりません。 以下のソースを実行すると、 「Hello World!」のみ表示されます。 原因がわからないので、ご教授願えませんでしょうか。 【ソース】 package sib.stringex; import android.app.Activity; import android.os.Bundle; import android.view.Window; public class StringEx extends Activity{ @Override public void onCreate(Bundle bundle){ super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(new StringView(this)); } } package sib.stringex; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.View; public class StringView extends View { public StringView(Context context){ super(context); setBackgroundColor(Color.WHITE); } @Override protected void onDraw(Canvas canvas){ Paint paint= new Paint(); paint.setAntiAlias(true); paint.setTextSize(24); paint.setColor(Color.rgb(0, 0, 0)); canvas.drawText("画面サイズ:"+ getWidth()+ "X"+getHeight(), 0, 60, paint); canvas.drawText("文字幅:"+(int)paint.measureText("A"), 0, 60*2, paint); canvas.drawText("アセント"+(int)paint.ascent(), 0, 60*3, paint); canvas.drawText("ディセント"+(int)paint.descent(), 0, 60*4, paint); paint.setTextSize(24); paint.setColor(Color.rgb(255, 0, 0)); canvas.drawText("24dot", 0, 60*5, paint); paint.setTextSize(32); paint.setColor(Color.rgb(0, 255, 0)); canvas.drawText("32dot", 0, 60*6, paint); paint.setTextSize(48); paint.setColor(Color.rgb(0, 0, 255)); canvas.drawText("32dot", 0, 60*7, paint); } }

  • MFC VC++ 6.0 使用 

    class patchmodel{ double a; double b; private: void Draw(); } void patchmodel::Draw(){ CDC DC; CDC* dc = GetDC(); dc->TextOut((int)a,(int)b,"HELLO"); ReleaseDC( dc ); } と 実行してみたところ エラーがでます。 error C2660: 'GetDC' : 関数が不正な 0 個の実引数をともなって呼び出されました。 error C2660: 'ReleaseDC' : 関数が不正な 1 個の実引数をともなって呼び出されました。 CModel::OnDraw(CDC* pDC) を あえて使わずに 実行したいので このように 簡単なもので 試して見たのですが、うまくいきません。 GetDC の使い方を まちがえているのでしょうか? お返事ください。

  • [android]画面に円が表示されない原因

    こんにちは。 以下のサイトを参考に白い画面に赤い円を表示させたいのですが、実際にはエミュレータ上に表示されません。 logcatのエラーもありません。原因と対処方法をご教授ください。 eclipseのバージョンは以下のとおりです。 Eclipse Platform 3.8.0.v20120607-071945-9gF7jI7nG5qByXMVdkhRMWBQlF4PnDCLybDCPQ http://www.hakkaku.net/articles/20091127-594 ★MainActivity.java package com.example.test001_001; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 描画クラスを設定 setContentView(new TestDrawView(getApplication())); } /* 描画用クラス */ class TestDrawView extends View { public TestDrawView(Context c) { super(c); } } // このメソッドで描画を行う protected void onDraw(Canvas c) { // --------- (*1)Check!! c.drawColor(Color.WHITE); Paint p = new Paint(); p.setColor(Color.RED); p.setStyle(Paint.Style.FILL); c.drawCircle(100, 100, 50, p); } }

  • iアプリの表示

    いま、簡単なアプリをつくろうと思い、以下のところまでできましたが、 Flashのモーショントウィーンみたいしたいのですが、前の表示の画像が消えないので、つながった画像表示になります。どうしたら前の画像表示が消えて、新しい表示のみにすることができるか?教えていただけたらと思います。docomoのiアプリです。  public class JavaGame extends IApplication { public void start(){ MyCanvas canvas = new MyCanvas(); Display.setCurrent(canvas); canvas.run(); terminate(); } } import com.nttdocomo.ui.*; public final class MyCanvas extends Canvas{ public final static int FPS = 30; // フレームレート public final static int INTERVAL = 1000 / FPS; // フレームの間隔 // --- 変数の定義 long lastTime = 0; // 前回のフレーム終了時間 // --- 変数の定義 Graphics grp = getGraphics(); // グラフィックの取得 MediaImage mi; Image img; int chx; int chy; void run(){ init(); while(true){ proc(); draw(); sleep(); } } void init(){ mi=MediaManager.getImage("resource:///0.gif"); try{ mi.use(); }catch(Exception e){ } img =mi.getImage(); } void proc(){ chy+=10; } void draw() { grp.lock(); int color =Graphics.getColorOfRGB(0,0,255); grp.setColor(color); grp.drawImage(img,chx,chy); grp.unlock(true); } // --- 休止 void sleep() { long wait = INTERVAL - (System.currentTimeMillis() - lastTime); if(wait > 0) { try { Thread.sleep(wait); } catch(Exception e) { } } lastTime = System.currentTimeMillis(); } public void paint(Graphics grp){ } }//class

  • JAVAのプリファレンスがうまくいかず困っています

    独学で勉強初めてまだ一ヶ月程度なのですがプリファレンスの扱いがうまくいかず困っています。 とりあえずアンドロイドアプリのシューティングゲームを作りながら判らなかったら調べつつ進めているので、根本的に間違っているかもですが御教授頂ければと思います。 ゲームのステータスをいじる画面をviewクラスで作り保存できるようにと思ったのですが、アクティビティでしかプリファレンスを扱えず無理やりやろうとしてこうなってしまいました。 ------------------------- public class SettingActivity extends Activity { int speed; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); //プリファレンスの準備 speed = pref.getInt("speed",1); //呼び出し 第二引数は初期値 LinearLayout l = new LinearLayout(this); l.setOrientation(LinearLayout.VERTICAL); setContentView(l); l.addView(new Setting(this)); } @Override protected void onPause() { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); //プリファレンスの準備 Setting set = new Setting(this); Editor date = pref.edit(); date.putInt("speed",set.getSpeed()); date.commit(); //保存 super.onPause(); } -------------------------------- public class Setting extends View { SettingActivity activity = (SettingActivity)this.getContext(); int speed = activity.speed; void setSpeed(int sp) { speed = sp; } int getSpeed() { return speed; } public void onDraw(Canvas c) { super.onDraw(c); if(画面の表示が変わったとき) speed = 表示の値に; setSpeed(speed); } ----------------------------- 色々調べた結果このような感じになったのですが、どうしても最初の画面に戻ったら元に戻ってしまいます。 どのようにすればうまくいきますでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • package com.rensyu;コメントを入れて欲しいのですが…

    package com.rensyu;コメントを入れて欲しいのですが… import java.util.Calendar; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class rensyu extends Activity { Thread drawThread; class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback { Bitmap osb; Canvas osc; public MySurfaceView(Context context) { super(context); getHolder().addCallback(this); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d("TEST", "surfaceChanged"); } @Override public void surfaceCreated(final SurfaceHolder holder) { Log.d("TEST", "surfaceCreated"); final Paint paint = new Paint(); paint.setColor(Color.RED); paint.setAntiAlias(true); paint.setTextSize(24); final Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.icon); drawThread = new Thread() { public void run() { try { while (true) { Canvas canvas = holder.lockCanvas(); if (osb == null) { osb = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.RGB_565); osc = new Canvas(osb); } osc.drawColor(Color.WHITE); Calendar cal = Calendar.getInstance(); String s = String.format("%02d:%02d:%02d.%03d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), cal.get(Calendar.MILLISECOND)); osc.drawText(s, 0, paint.getTextSize(), paint); osc.drawBitmap(bitmap, 0, paint.getTextSize(), null); canvas.drawBitmap(osb, 0, 0, null); holder.unlockCanvasAndPost(canvas); Thread.sleep(10); } } catch (Exception e) { } } }; drawThread.start(); } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d("TEST", "surfaceDestroyed"); } }

    • ベストアンサー
    • Java
  • グーグルアースとグーグルマップの違いは?

    現在の状態: グーグルアースを使うには、ダウンロードが必要だと聞いたので 「グーグルアース」ダウンロードと云うのをクリックしました (ディスクトップにシンボルアイコンがでましたので、これは成功したとおもいます。 「グーグルマップ」については、検索しただけで出ます (どうしてこちらはダウンロードの必要ないのかもちょっと疑問です) 両方とも、使い方をよく解らないまま、やってみました(ストリートビューまで) 使い方によって違いがでてるのか、機能がちがうのか うまく把握できず、知識の整理が 出来ません。 質問です。 (1)グーグルアースにおいては、実写とストリートビューが出来ましたが、地図がでないように感じます が、正しい判断でしょうか?(グーグルマップでは地図が出ました) (2)グーグルアースで外国においては、ストリートビューが見られないように感じますが 正しい判断ですか? つぎはお願いです。 (1)両方の使い分けが解る(両方の違いが解る)文献のご紹介をお願いいたします。 (2)これはできればのお願いですが、地図表示時代~ストリートビュー時代までの発展の経過などの 資料があれば、なお、うれしいです(池上先生流に教わると理解が深まるような気がします。ぜいたく なお願いですね)  よろしくお願いいたします。 ビスタ・2007です。