2012-04-06 6 views
-1

半静的(まれに変化する)ビットマップを作成する非表示のアイコンを受け入れるカスタムビュー(表示)を作成しました。そのアイデアは、そのキャンバスに印刷するためにいくつかのアイコンをディスプレイに渡すことです。私の問題は、ディスプレイを実際にアイコンのビットマップをキャンバスに描画することができないことです。小さなビットマップを大きなキャンバスに描画できないのはなぜですか?

以下のコードは、私の持つ実例です。 、このコードは右を下げ、0からは50pxの直径の円を描くように左上からラインをプリントアウトする必要があります

public class AndroidTestoActivity extends Activity { 
    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FrameLayout fl = new FrameLayout(this); 
     Display tv = new Display(this); 
     tv.setLayoutParams(new LayoutParams(200, 200)); 
     fl.addView(tv); 
     setContentView(fl); 
    } 

    public class Display extends View { 
     Paint vPaint = new Paint(); 
     Icon item = new Icon(); 

     public Display(Context context) { 
      super(context); 
      vPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
      vPaint.setColor(0x0ff000000); 
      setBackgroundColor(0xffffffff); 
     } 

     @Override public void onDraw(Canvas canvas) { 
      canvas.scale(200, 200); 
      item.onDraw(canvas); 
      canvas.drawLine(0.0f, 0.0f, 1.0f, 1.0f, vPaint); 
     } 
    } 

    public class Icon { 
     Bitmap myImage; 
     Paint mPaint = new Paint(); 

     public Icon() { 
      myImage = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888); 
      mPaint.setStyle(Style.FILL); 
      mPaint.setColor(0xffff0000); 
      Canvas c = new Canvas(myImage); 
      c.scale(50, 50); 
      c.drawCircle(0.5f, 0.5f, 0.5f, mPaint); 
     } 

     public void onDraw(Canvas canvas) { 
      canvas.drawBitmap(myImage, 0, 0, null); 
     } 
    } 
} 

(働くことによって私が意味する、それが私はそれが欲しいものを印刷していないことを、適切に実行されます) 0から50,50。代わりに、私が得るのはラインです。しかし、ビットマップをファイルに出力すると、ファイルは正確に出力されます。

何が起こっているかについての手掛かりはありますか?

EDIT
私の質問を明確にするために、私はDisplayViewよりも著しく小さいビットマップを作成しています。私がDisplayViewにビットマップを描画しようとすると、ビットマップは描画されず、適切にスケーリングされたものではありません。キャンバスがビットマップを正しく描画しないのはなぜですか?

UPDATE DiplayのonDrawメソッドで
、私はcanvas.scale(200, 200);前にラインitems.onDraw(canvas);を移動しました。今度はテストサークルが正しく描画されます。このような単純な変更は、透過的な方法で円を描くことを完全に無視するために何をしていますか?

+0

'scale()'、 'translate()'、 'skew()'、その他のものについては(http://developer.android.com/reference/android/graphics/Canvas.html) "現在のマトリックス"は[変換マトリックス](http://en.wikipedia.org/wiki/Transformation_matrix)で動作します - あなたが望むものを得るために、それらを次々にやっていくのと同じくらい簡単です。 )。しかし、私は、この特定の例では、その行を動かすことで答えるのに十分な瞬間を覚えていません。 – Izkata

答えて

1

を持つために使用されます私は@MartinAsenovが大抵正しい。私がしなければならなかったのは、キャッシュされたビットマップをすべての前(または保存して復元した後)に描画することでした。私はキャンバスを拡大縮小し、通常描画します。キャンバスのスケーリングについては、それがまだ必要であると信じています(他のすべてのウィジェットは、問題なく描画する前に、その幅と高さにスケールしています)。

ここでは、最終的な動作テストの動作を示します。

public class AndroidTestoActivity extends Activity { 
    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FrameLayout fl = new FrameLayout(this); 
     Display tv = new Display(this); 
     tv.setLayoutParams(new LayoutParams(200, 200)); 
     fl.addView(tv); 
     setContentView(fl); 
    } 

    public class Display extends View { 
     Paint vPaint = new Paint(); 
     Icon item = new Icon(); 

     public Display(Context context) { 
      super(context); 
      vPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
      vPaint.setColor(0x0ff000000); 
      setBackgroundColor(0xffffffff); 
     } 

     @Override public void onDraw(Canvas canvas) { 
      item.onDraw(canvas); 
      canvas.save(Canvas.MATRIX_SAVE_FLAG); 
      canvas.scale(getWidth(), getHeight()); 

      canvas.drawLine(0.0f, 0.0f, 1.0f, 1.0f, vPaint); 
      canvas.restore(); 
     } 
    } 

    public class Icon { 
     Bitmap myImage; 
     Paint mPaint = new Paint(); 

     public Icon() { 
      myImage = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888); 
      mPaint.setStyle(Style.FILL); 
      mPaint.setColor(0xffff0000); 
      Canvas c = new Canvas(myImage); 
      c.scale(50, 50); 
      c.drawCircle(0.5f, 0.5f, 0.5f, mPaint); 
     } 

     public void onDraw(Canvas canvas) { 
      canvas.drawBitmap(myImage, 50, 50, null); 
     } 
    } 
} 
+0

投票の理由がありますか?私は気にしませんが、あなたが私に言わないと、私が間違ったことから学ぶことができません。 – AedonEtLIRA

0

あなたのコードを見ている私は、主な問題は、あなたが0f..1fされる座標を想定したが、真実であることだと思います0f..width/0f..height - フロートは、それが回転すると、サブピクセル

+0

あなたはどういう意味ですか? DisplayViewで0-1.0fを使って線を描くことができます。ビューカンバスの描画とビューから作成されたビットマップの違いはどこですか? – AedonEtLIRA

0

私の最高の推測では、円が(それ200Xスケーリング)大きすぎるとなっていることになりますので、その座標が負の取得(すなわち左上隅を(-5、-10)です)。アンドロイドシステムでは、負の座標を持つビューを描画しません(これを実現するには、onMeasure()メソッドをオーバーライドする必要があります)

+0

'View#drawBitmap(Bitmap、float、float、Paint)'呼び出しがビットマップのサイズを変更するとは思わない。私が正しいとすれば、サークルはどのように大きくなりすぎていますか?ビットマップのサイズに直接関係しないディメンションですか(この場合は50x50ピクセルですか)。 – AedonEtLIRA

+0

Iconクラスのコンストラクタでは、25ピクセルの半径の円を描画していますが、これは問題ありません。ただし、ondrawメソッドでは、DisplayクラスのonDraw()メソッドからキャンバスを取得しています。このキャンバスは200倍に拡大され、その上に描画されたものは200倍大きく表示されます。あなたの円は画面の左上隅に描画され、その半径は25ピクセルですので、200 * 25 = 5000ピクセルになります。今、私はあなたの意見が画面の外に出る理由を理解していると思います。 – asenovm

+0

私は賞金と賞をあなたに授与しました。ツアーの答えが正しい方向に私を指摘したからです。しかし、直接的な解決策ではありませんでした。 – AedonEtLIRA

0

キャンバスの仕組みがちょっと混乱していると思います。混乱させるのは簡単です)。ビットマップをパラメータとして扱うCanvasを呼び出す方法は、ビットマップをペイントしているものとして扱うことになるため、ビットマップのサイズによって制約を受けます。 パラメータを持たないキャンバス(空のキャンバス)を作成してからビットマップを描画すると、実際にはビットマップが変更されず、キャンバスに描画されます。その状況では、四角形のどこにでもビットマップを描画し、その周りに円を描くことができます。

また、onDrawメソッドをオーバーライドして、そのキャンバス(コールバックを呼び出したときに手渡す)を収集して、そのキャンバスに必要なものを描画することができます。それがアクセスする最も簡単な方法です

+0

私はあなたが言っていることに従うと思いますが、小さな事例を投稿できますか? – AedonEtLIRA

+0

私は自分の電話機にいるので、コード例を入力するのは難しいです(音声認識はこのコメントのようにうまく機能します)。あなたはあなたがしたいことに非常に近いです。 onDrawメソッドを使って作業し、Iconメソッドで行っているようにビットマップに描画するのではなく、そのキャンバスを描画に使用します。 –

関連する問題