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

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

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

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

Android

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

Q&A

解決済

1回答

1916閲覧

invalidate()で再描画するときに特定の箇所の円が消えてしまいます

ko20vonobird

総合スコア50

Java

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

Android

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

0グッド

0クリップ

投稿2017/01/24 06:18

編集2017/01/24 07:52

###実現したいこと
二か所に円を描画します。最終的には両方が描画されている状態を目指します。

###発生している問題
始めに描いた方の円がすべて消えてしまいます。

###該当のソースコード

java

1circlemake = new Runnable() { 2 @Override 3 public void run() { 4 //円のアニメーション描画 5 sw = 1; 6 cnten1a = cnten1a + 1; 7 cta.endraw(); 8 if (cnten1a < 22) {//0-5で円の収縮、6で的、17-22で円の収縮、23で的 9 cbrunHandler.postDelayed(circlemake, 50); 10 }else if (cnten1a == 22){ 11 cbrunHandler.removeCallbacks(circlemake); 12 } 13 } 14 }; 15 cbrunHandler.postDelayed(circlemake, 50); 16 } 17 public class Ct extends View { 18 private float r1-r6;//r1-r6はそれぞれの一番目の円の半径 19 ※省略してます。 20 private float r1b-r6b;//r1b-r6bはそれぞれの二番目の円の半径 21 ※省略してます。 22 private float cx;//cx,cyは一番目の円の座標 23 private float cy; 24 private float cxb;//cxb,cybは二番目の円の座標 25 private float cyb; 26 private int cnten1 = 0;//円を収縮させるアニメーションに用いる変数 27 private int cnten2 = 0;//円を収縮させるアニメーションに用いる変数 28 private int en1sw1 = 0;//第二if文に進むための変数 29 private int en1sw2 = 0;//第三if文に進むための変数 30 private int en1sw3 = 0;//第四if文に進むための変数 31 private int countb = 1;//元々は一定秒を測るための変数で、今はただのカウンター 32 public Ct(Context context){ 33 super(context); 34 //Log.d("gw", ctsgw); 35 //Log.d("gh", ctsgh); 36 } 37 //ここら辺にメソッドを置いて、初期化を行うべきか? 38 protected void onDraw(Canvas canvas){ 39 super.onDraw(canvas); 40 int gw = getWinWM();//privateにする 41 int gh = getWinHM(); 42 float tw = getTitlewidthc(); 43 float twc = getTitlewherec(); 44 float ty = getTitley(); 45 int r1l = 25; 46 int r2l = 25;//ここまで 47 float raden1 = (float) (20 * Math.PI / 180); 48 //String ctsgw = String.valueOf(gw); 49 //String ctsgh = String.valueOf(gh); 50 //Log.d("gw", ctsgw); 51 //Log.d("gh", ctsgh); 52 53 Paint pam = new Paint(); 54 55 if (sw == 1 && en1sw1 != 1 && en1sw2 != 1 && en1sw3 != 1){ 56 //ここにすべての処理を書いていく↓ 57 //第一の円 58 cnten1 = cnten1 + 1; 59 if (cnten1 == 5){ 60 en1sw1 = 1; 61 } 62 r1 = 3 + (5 * r1l) - (cnten1 * r1l);//3に収束するから割合じゃなくて良い 63 cx = (float) ((tw * Math.cos(raden1) / 11) + twc + tw - (tw * Math.cos(raden1))); 64 //String cxa = String.valueOf(tw * Math.cos(raden1) / 10); 65 //String cxb = String.valueOf(twc); 66 //String cxc = String.valueOf(tw * Math.cos(raden1)); 67 //Log.d("cxa", cxa); 68 //Log.d("cxb", cxb); 69 //Log.d("cxc", cxc); 70 cy = (float) ((tw * Math.sin(raden1) / 2) + ty); 71 pam.setColor(Color.argb(255, 0, 0, 0)); 72 pam.setStyle(Paint.Style.STROKE); 73 pam.setStrokeWidth(3); 74 canvas.drawCircle(cx, cy, r1, pam); 75 //ここにすべての処理を書いていく↑ 76 }else if (sw == 1 && en1sw1 == 1 && en1sw2 != 1 && en1sw3 != 1){//en1=左の円、sw1一番外に広がる円 77 78 r2 = (float) (tw * Math.cos(raden1) / 11);//60 79 pam.setColor(Color.argb(255, 0, 0, 0)); 80 pam.setStyle(Paint.Style.STROKE); 81 pam.setStrokeWidth(3); 82 canvas.drawCircle(cx, cy, r2, pam); 83 pam.setColor(Color.argb(255, 255, 255, 255)); 84 pam.setStyle(Paint.Style.FILL); 85 canvas.drawCircle(cx, cy, r2 - 1, pam); 86 r3 = r2 / 6 * 5;//r2 / 6 * 5; 87 pam.setColor(Color.argb(255, 0, 0, 0)); 88 pam.setStyle(Paint.Style.STROKE); 89 pam.setStrokeWidth(3); 90 canvas.drawCircle(cx, cy, r3, pam); 91 pam.setColor(Color.argb(255, 0, 0, 0)); 92 pam.setStyle(Paint.Style.FILL); 93 canvas.drawCircle(cx, cy, r3 - 1, pam); 94 r4 = r3 / 5 * 4; 95 pam.setColor(Color.argb(255, 0, 0, 0)); 96 pam.setStyle(Paint.Style.STROKE); 97 pam.setStrokeWidth(3); 98 canvas.drawCircle(cx, cy, r4, pam); 99 pam.setColor(Color.argb(235, 0, 0, 255)); 100 pam.setStyle(Paint.Style.FILL); 101 canvas.drawCircle(cx, cy, r4 - 1, pam); 102 r5 = r4 / 4 * 3; 103 pam.setColor(Color.argb(255, 0, 0, 0)); 104 pam.setStyle(Paint.Style.STROKE); 105 pam.setStrokeWidth(3); 106 canvas.drawCircle(cx, cy ,r5, pam); 107 pam.setColor(Color.argb(225, 255, 0, 0)); 108 pam.setStyle(Paint.Style.FILL); 109 canvas.drawCircle(cx, cy, r5 - 1, pam); 110 r6 = r5 / 3 * 2; 111 pam.setColor(Color.argb(255, 0, 0, 0)); 112 pam.setStyle(Paint.Style.STROKE); 113 pam.setStrokeWidth(3); 114 canvas.drawCircle(cx, cy, r6, pam); 115 pam.setColor(Color.argb(255, 255, 255, 128)); 116 pam.setStyle(Paint.Style.FILL); 117 canvas.drawCircle(cx, cy, r6 - 1, pam); 118 en1sw2 = 1; 119 120 }else if (sw == 1 && en1sw1 == 1 && en1sw2 == 1 && en1sw3 != 1){ 121 if (countb == 1) { 122 sleep(500); 123 } 124 String cxst = String.valueOf(cx); 125 String cyst = String.valueOf(cy); 126 String r2st = String.valueOf(r2); 127 Log.d("cx", cxst); 128 Log.d("cy", cyst); 129 Log.d("r2", r2st); 130 if (1 <= countb && countb <= 5) {//円の収縮 131 cnten2 = cnten2 + 1; 132 r1b = 3 + (5 * r2l) - (cnten2 * r2l); 133 cxb = (float) (tw / 9 * (-1 + (10 * Math.cos(raden1))) + twc); 134 cyb = (float) ((-11 * tw * Math.sin(raden1) / 18) + ty); 135 String cxblog = String.valueOf(cxb); 136 String cyblog = String.valueOf(cyb); 137 Log.d("cxb", cxblog); 138 Log.d("cyb", cyblog); 139 pam.setColor(Color.argb(255, 0, 0, 0)); 140 pam.setStyle(Paint.Style.STROKE); 141 pam.setStrokeWidth(3); 142 canvas.drawCircle(cxb, cyb, r1b, pam); 143 if (countb == 5) { 144 en1sw3 = 1; 145 } 146 countb = countb + 1; 147 } 148 }else if (sw == 1 && en1sw1 == 1 && en1sw2 == 1 && en1sw3 == 1){ 149 r2b = (float) (tw * Math.cos(raden1) / 9); 150 pam.setColor(Color.argb(255, 0, 0, 0)); 151 pam.setStyle(Paint.Style.STROKE); 152 pam.setStrokeWidth(3); 153 canvas.drawCircle(cxb, cyb, r2b, pam); 154 pam.setColor(Color.argb(255, 255, 255, 255)); 155 pam.setStyle(Paint.Style.FILL); 156 canvas.drawCircle(cxb, cyb, r2b - 1, pam); 157 r3b = r2b / 6 * 5;//r2 / 6 * 5; 158 pam.setColor(Color.argb(255, 0, 0, 0)); 159 pam.setStyle(Paint.Style.STROKE); 160 pam.setStrokeWidth(3); 161 canvas.drawCircle(cxb, cyb, r3b, pam); 162 pam.setColor(Color.argb(255, 0, 0, 0)); 163 pam.setStyle(Paint.Style.FILL); 164 canvas.drawCircle(cxb, cyb, r3b - 1, pam); 165 r4b = r3b / 5 * 4; 166 pam.setColor(Color.argb(255, 0, 0, 0)); 167 pam.setStyle(Paint.Style.STROKE); 168 pam.setStrokeWidth(3); 169 canvas.drawCircle(cxb, cyb, r4b, pam); 170 pam.setColor(Color.argb(235, 0, 0, 255)); 171 pam.setStyle(Paint.Style.FILL); 172 canvas.drawCircle(cxb, cyb, r4b - 1, pam); 173 r5b = r4b / 4 * 3; 174 pam.setColor(Color.argb(255, 0, 0, 0)); 175 pam.setStyle(Paint.Style.STROKE); 176 pam.setStrokeWidth(3); 177 canvas.drawCircle(cxb, cyb,r5b, pam); 178 pam.setColor(Color.argb(225, 255, 0, 0)); 179 pam.setStyle(Paint.Style.FILL); 180 canvas.drawCircle(cxb, cyb, r5b - 1, pam); 181 r6b = r5b / 3 * 2; 182 pam.setColor(Color.argb(255, 0, 0, 0)); 183 pam.setStyle(Paint.Style.STROKE); 184 pam.setStrokeWidth(3); 185 canvas.drawCircle(cxb, cyb, r6b, pam); 186 pam.setColor(Color.argb(255, 255, 255, 128)); 187 pam.setStyle(Paint.Style.FILL); 188 canvas.drawCircle(cxb, cyb, r6b - 1, pam); 189 } 190 } 191 public synchronized void sleep(long msec){ 192 try{ 193 wait(msec); 194 }catch (InterruptedException e){ 195 ///// 196 } 197 } 198 public void endraw(){ 199 invalidate(); 200 } 201 }

###判明したこと
if (countb == 1){
sleep(100);
}
よりも後ろでクリアされていると思われます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

if文で描画を分けているので各if文であなたが描きたい数のdrawCircleが呼ばれているかを確認しましょう。

また、変数名が適当すぎて何に使う変数かわかりません。わかりやすい命名を心がけた方が回答が付きやすくなりますよ。

投稿2017/01/24 07:30

yona

総合スコア18155

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

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

ko20vonobird

2017/01/24 07:59

if文に入る回数を調べたところ、四番目のif文が過剰に繰り返されていたので修正しました。画面表示での確認ですが、一度は一番目の円について描画されているのを確認しております。なので、少なくとも不足していることはないと思います。 質問の項目に付け加えたのですが、どこで円が消えてしまうかが粗方わかったので記載しております。 変数名について、応急処置として、変数の横に説明を付けました。 私の考えで、どのif文も通らず再描画されていたりするのが原因だったりするのかと思いましたが、sw系の変数はその前のif文での処理と同時に1にして次のif文に進むようにセットしていることを確認したので、これではないかな、と思います。 長くなりました、すいません。もし、私が気づいてない部分があれば、もしよければ教えてください、よろしくお願いします。
yona

2017/01/24 08:14

UIスレッドでsleepしてはいけません、何が起きるかわかりません。 また、この程度なら応急処置ではなく、リファクタリングを行いましょう。AndroidStudioはメモ帳じゃないんですよ、変数名にキャレットをあててShift+F6を押してください。 他にも円の中心座標を示す変数はPointを使うべきだし、同じ使い方をするペイントはまとめて変数として宣言する事でコードはスッキリしますよ。
ko20vonobird

2017/01/24 08:37

sleepの一連のコードは削除いたしました。 メモ帳ではないのは存じております。私が言った応急処置は、teratailでの質問のコードに説明を付けるということです。こちらのAndroidStudio内では、変数のメモはしておりません。全て何かしらの法則を付けて命名しております。 Pointは追々使っていこうと思います。 文字数がギリギリなので、質問画面ではcx,cy,cxb,cybを使わせてください。 sleep()を外しましたが相変わらず一つ目の円が消えてしまうままではあります。
yona

2017/01/24 08:42

では、次は全てのif文にelseブロックを追加してログ出力してください。 どのif文にも入らないことがないことを証明してください。
ko20vonobird

2017/01/24 09:42 編集

パソコンがフリーズしてしまい、時間がかかりました、申し訳ありません。 各四つのif文の後にelseブロックを追加して、ログ出力をし、四つすべてのelseになってないか、つまり、どれにも入らないということがないか確かめましたが、全ての呼び出しにおいていずれかのif文ブロックに入っていることが確認できました。 ちなみに、まだswが1になっていない段階で呼び出された痕跡はありました。
yona

2017/01/24 09:46

if (1 <= countb && countb <= 5) のelseブロックも確認しましたか?
ko20vonobird

2017/01/24 09:57

すいません、確認するのを忘れていました。 今確認しましたが、elseにはなっていませんでした。
yona

2017/01/24 10:45

それなら毎回描画処理を通っていると言うことですね。 if文のどの分岐の描画がされていないんですか?
ko20vonobird

2017/01/24 10:56 編集

描画されてないわけではないのです、が、なぜか、消えるのです。一回一瞬描画された後、消えます。 if (sw == 1 && en1sw1 == 1 && en1sw2 != 1 && en1sw3 != 1)で描画したものです。
yona

2017/01/24 11:00 編集

そのif文の中でdrawCircleに渡している値をログ出力してください。
ko20vonobird

2017/01/24 11:06 編集

わかりました。 その前に一つ気になったことがありまして、お聞きしたいのですが、java、androidのinvalidate();とは、もしかして一度クリアされますか?画面を といいますのも、一つ目の円は一回目の描画後、再び描画するようには書いていないのです。
yona

2017/01/24 11:07

再描画命令なのでonDrawが呼ばれます、onDraw内にクリアする処理があるならクリアされます。
ko20vonobird

2017/01/24 11:14

なるほど、ということは、onDrawが以前に一度描かれたものをinvalidate()で呼び出された時にクリアしたりすることはないのですね?
ko20vonobird

2017/01/24 11:26

ログ出力したので報告します。 cx: 166.18443 cy: 361.86664 r2: 56.381557 r3: 46.98463 r4: 37.587704 r5: 28.190777 r6: 18.793852 だったので、数値としてはちゃんと出ていると思います。
ko20vonobird

2017/01/24 11:48

二つ目のif文以降にも一つ目の円の描画命令を書いたところ、消されることもなく無事に二か所に円が描かれました。 大変お騒がせしました、今回もありがとうございます。
yona

2017/01/24 11:56

なるほど、一度クリアされていたんですね。
ko20vonobird

2017/01/24 11:57

はい、Viewは再描画の度にクリアされるようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問