2017-06-07 12 views
0

試してみた後、私はちょうどイライラします。キャンバスは描かれるべきアルファを持つ色を描画しません

私は、背景の上に完全に透明から白に色のグラデーションを描画する簡単なアプリケーションを作りたかった。 テストのために、私はちょうど黒と白といくつかの灰色の背景を使用しました。

しかし、私は結果を見て、アプリを起動したとき、私はこれを見た: screenshot from a phone

いくつかの色が暗いか、彼らが必要以上に色付きであることが判明。たとえば、左のバーは完全に白いはずです。

私はすぐにそれがどのように見えるべきかを示す画像を作った: made with GIMP 2

これは私の描画関数のコードです:

 for(int i = 0; i < 5; i++) { 
      p.setARGB(255, (255/4*(4-i)), (255/4*(4-i)), (255/4*(4-i))); 
      canvas.drawRect(canvas.getWidth()/5*i, 0, canvas.getWidth()/5*(i+1), canvas.getHeight(), p); 
     } 
     for(int i = 0; i < 256; i++) { 
      p.setARGB(i, 255, 255, 255); 
      canvas.drawRect(0, i*(canvas.getHeight()/256), canvas.getWidth(), (i+1)*(canvas.getHeight()/256), p); 
     } 

は、私が何をしないのですか?これはキャンバスの仕組みですか?これを修正してGIMPで作成した私の例のように見えるようにするにはどうすればいいですか?

答えて

0

アルゴリズムが間違っているためです。色の四角形を作成することは、滑らかなグラデーションと同じではありません。あなたの方法は、上記のようにアーティファクトを持つことになります。あなた自身でそれをやろうとするのではなく、すでにプラットフォームに組み込まれているGradientDrawablesを使用してください。

0

(canvas.getHeight()/256)原因精度の問題。

使用float gHeight = canvas.getHeight()/256f;の代わり(canvas.getHeight()/256)

フルコード:

private Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 

@Override 
protected void onDraw(Canvas canvas) { 
    for (int i = 0; i < 5; i++) { 
     p.setARGB(255, (255/4 * (4 - i)), (255/4 * (4 - i)), (255/4 * (4 - i))); 
     canvas.drawRect(canvas.getWidth()/5 * i, 0, canvas.getWidth()/5 * (i + 1), canvas.getHeight(), p); 
    } 
    float gHeight = canvas.getHeight()/256f; 
    for (int i = 0; i < 256; i++) { 
     p.setARGB(i, 255, 255, 255); 

     canvas.drawRect(0, i * gHeight, canvas.getWidth(), (i + 1) * gHeight, p); 
    } 
} 

画像圧縮は、携帯電話のすべてのものの上に、いくつかの問題を引き起こし、私は私の問題を修正し image compress cause some problem ,on phone everything is ok

+0

あなたのコードと一致するようにコードを変更しましたが、まだ上の画像が表示されます。たぶん問題は、別の方法でレンダリングするために発生します。自分のプロジェクトをEメールやSkype経由で送ってくれる方法はありますか?ご協力いただきありがとうございます。 –

+0

私は何も特別なことはしませんでした。プロジェクトhttps://github.com/fantasyRqg/GradientTestです –

0

okです。私はSurfaceViewを使用しました。デフォルトでは、RGB_565形式が使用されています。このフォーマットのために品質が低下します。アルファチャンネルを持つARGB_8888にフォーマットを変更するには、コードにこの行を追加する必要があります。

mSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);

それは私が、私はキャンバスを表示するSurfaceViewを使用していますことを言わなかったことを、私の間違いでした。私の間違い、特にFantasy_RQGを見つけようとしたすべての人に感謝します。

関連する問題