描画についての質問

閲覧: 1,320 回
最初の未読メッセージにスキップ

nao

未読、
2011/07/24 12:56:482011/07/24
To: 日本Androidの会
はじめまして、naoと申します。
canvasへの描画について質問したく思いまして投稿しました。
ペイントの色の設定をpaint.setARGB(150, 0,0, 0)としまして、黒の半透明にしています。
canvasに描画する際、この色で複数回描画するのですが、同じ部分を描画すると色が濃く(透明ではなくなる)なってしまいます。
同じ部分を塗りつぶしても色を透明のままにすることはできないでしょうか?
よろしくお願いいたします。

Tetsuro Nakamura

未読、
2011/07/24 18:48:452011/07/24
To: android-g...@googlegroups.com

t2lowと申します。

私もちゃんと理解してはいないのですが、
Paint.setXfermode()で色の重ね方を指定できるようです。
PorterDuff.Mode.DSTあたりを指定した PorterDuffXfermodeを
設定すれば、指定した色での描画ができるかと思います。
想定した塗り方でなければ、 PorterDuff.Modeを変えて
いろいろ試してみて下さい。

以上です。

2011/07/25 1:57 "nao" <naonaona...@hotmail.co.jp>:

nao

未読、
2011/07/25 11:47:382011/07/25
To: 日本Androidの会
はじめまして、 t2lowさん。

一応指定できるパターンはすべて試したのですがやはり描画するたびに色が濃くなってしまいました。

Stone

未読、
2011/07/25 17:57:502011/07/25
To: 日本Androidの会
Stone@調布、東京です。
いまだにセミが鳴きません。虫も。


これは試しましたか?
setXfermode(new PorterDuffXfermode(Mode.SRC));



On 7月26日, 午前12:47, nao <naonaonaoya12...@hotmail.co.jp> wrote:
> はじめまして、 t2lowさん。
>
> 一応指定できるパターンはすべて試したのですがやはり描画するたびに色が濃くなってしまいました。

Tetsuro Nakamura

未読、
2011/07/25 18:48:072011/07/25
To: android-g...@googlegroups.com

昨夜、少しコードを書いて試してみました。
半透明の黒色#80000000でdrawLine()を2回呼んで線を交差させただけの簡単なコードです。
確かにnaoさんのおっしゃるように、半透明が重なって描画されると色が濃くなりました。

以前、この機能を使ってスクラッチカードを削るように、不透明を透明で上書きするということが実現できていたので、同じようにいけるかと思っていたのですが…。
どうも私の理解不足のようです。すみません。
現時点では私にはこれ以上わかりません…。

どなたかわかる方がいらっしゃいましたらご助力お願いいたします。

2011 7 26 06:58 "Stone" <ish...@cap.bekkoame.ne.jp>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

nao

未読、
2011/07/25 20:00:542011/07/25
To: 日本Androidの会
はじめまして、 Stone@さん。

はい、試しました。やはり重ねて描画するとだんだん色が濃くなってしまいます。

現在の状態は

paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
paint.setARGB(150, 0,0, 0);
paint.setStrokeWidth(20);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);

というパラメータ設定で

public boolean onTouch(View v, MotionEvent event) {
float x=(float) (event.getX()*1.2);
float y=(float) (event.getY()*1.4);

switch (event.getAction()){
       case MotionEvent.ACTION_DOWN:
path.reset();
path.moveTo(x, y);
x1=x;
y1=y;
break;
       case MotionEvent.ACTION_MOVE:
     path.quadTo(x1, y1, x, y);
x1=x;
     y1=y;
canvas.drawPath(path,paint);
canvas2.drawPath(path,paint2);
   path.reset();
path.moveTo(x, y);
break;
case MotionEvent.ACTION_UP:
if(x==x1&&y==y1)y1=y1+1;
path.quadTo(x1, y1, x, y);
canvas.drawPath(path,paint);
canvas2.drawPath(path,paint2);
path.reset();
break;
}

として入力画像に対して描写しています。
長々と、ソースを張り付けてしまいまして、申し訳ございません。

nao

未読、
2011/07/25 20:06:072011/07/25
To: 日本Androidの会
t2lowOnさん。

いえいえ、とんでもないです。わざわざソースコードまで書いて試して頂いて、申し訳ないです。
私も勉強不足でもっと勉強する必要があります。
本当に、ありがとうございます。

ishihata

未読、
2011/07/25 22:28:102011/07/25
To: 日本Androidの会
こんにちは。石畑と申します。

アルファ値を指定して同じ場所に描画するとそうなりますよね。

一番良い方法かどうかは分かりませんが、メモリ上にイメージバッファを確保して
いったんそこに(アルファを指定せず)描画してから、そのイメージをアルファ付きで
スクリーンに描画してはいかがでしょうか?
(いわゆるダブルバッファリングと同じ要領です)

Bitmap bmp = Bitmap.createBitmap(width, height,
Bitmap.Config.RGB_565);
Canvas bmp_canvas = new Canvas(bmp);

<bmp_canvasに対して描画>

Paint paint = new Paint();
paint.setAlpha(150);
view_canvas.drawBitmap(bmp, 0, 0, paint);

(コードはわりと適当です^^;)

ishihata

未読、
2011/07/25 22:35:542011/07/25
To: 日本Androidの会
連投すみません。石畑です。
最初の行、これじゃマズイですね(汗汗)

(誤)Bitmap bmp = Bitmap.createBitmap(width, height,
Bitmap.Config.RGB_565);

(正)Bitmap bmp = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);

これで行けるかな?

nao

未読、
2011/07/26 7:40:092011/07/26
To: 日本Androidの会
石場武さん、こんにちは。
返信が遅れまして、申し訳ございません。学校でした。


やはり色が濃くなってしまいました。setXfermode()は指定しなくてもよろしいでしょうか?

nao

未読、
2011/07/26 7:52:392011/07/26
To: 日本Androidの会
石場武さん、連投すみません。

いけた感じがします!ただ線を描いてる途中濃いところと薄いところが出てきてしまいます。。

ishihata

未読、
2011/07/26 21:36:492011/07/26
To: 日本Androidの会
naoさんこんにちは。石畑です。

bmp_canvasに対する描画でアルファを指定していませんか?
もしそうでしたら、アルファなしで描画してみてください。
アルファを指定するのは、最後のdrawBitmapに対してだけで十分のはずです。

On 7月26日, 午後8:52, nao <naonaonaoya12...@hotmail.co.jp> wrote:
> 石場武さん、連投すみません。
>
> いけた感じがします!ただ線を描いてる途中濃いところと薄いところが出てきてしまいます。。

Tetsuro Nakamura

未読、
2011/07/28 13:36:582011/07/28
To: android-g...@googlegroups.com
t2lowです。

少し調べてコードを書いてみました。

> 同じ部分を塗りつぶしても色を透明のままにすることはできないでしょうか?

これはやはりできます。
Paint.setXfermode()を使うと良いと思います。
最初に私は「DST」を使うと良いと回答してしまいましたが、
これは間違いでStoneさんが言うように「SRC」を指定するのが正解かと思います。

「SRC」は転送元の色を使う指定となります。
いくら色を重ねても指定した色で描画されます。
ただ、下が透けて見えるという表現には使えませんので、
一部分は透けるけれど、重なる部分は濃くしたくないということであれば、
石畑さんの言うようにBitmapを別に作るのが良いかと思います。

私のブログに作成したコードを置きました。
2本の半透明の線が交差しているだけのサンプルですが、
「SRC」を選択すると交差した部分も濃くならないことが確認できると思います。
http://blog.tappli.com/article/47008867.html

参考になれば幸いです。


2011年7月27日10:36 ishihata <ishihat...@gmail.com>:

全員に返信
投稿者に返信
転送
新着メール 0 件