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

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

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

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

3回答

3950閲覧

Androidプログラミングで画像の数字でカウントするにはどうしたらよいでしょうか?

19776340

総合スコア17

Java

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/05/08 23:33

編集2016/05/09 00:38
private Bitmap[] bmp = new Bitmap[10];//ビットマップ private int keta[]={0,1,2,3}; // x座標の画像位置 private boolean up1 = false; // 2桁目の数字をカウント private boolean up2 = false; // 3桁目の数字をカウント private boolean up3 = false; // 4桁目の数字をカウント private boolean up4 = false; // 9999の数字をカウント private int caunt1=0; // 画像表示 private int caunt2=0; // 画像表示 private int caunt3=0; // 画像表示 private int caunt4=0; // 画像表示 private int flag; // 画像の描画 for(int i = 0; i < 4; i++) { canvas.drawBitmap(bmp[0], keta[i]*70, 0, null); } if(caunt1>0 && caunt1<10){ canvas.drawBitmap(bmp[caunt1], keta[3]*70, 0, null); } if(caunt2>0 && caunt2<10){ canvas.drawBitmap(bmp[caunt2], keta[2]*70, 0, null); } if(caunt3>0 && caunt3<10){ canvas.drawBitmap(bmp[caunt3], keta[1]*70, 0, null); } if(caunt4>0 && caunt4<10){ canvas.drawBitmap(bmp[caunt4], keta[0]*70, 0, null); } if(up4){ canvas.drawBitmap(bmp[9], keta[0]*70, 0, null); canvas.drawBitmap(bmp[9], keta[1]*70, 0, null); canvas.drawBitmap(bmp[9], keta[2]*70, 0, null); canvas.drawBitmap(bmp[9], keta[3]*70, 0, null); } Paint paint = new Paint(); switch ((int)flag) { case 1: //カウント if(caunt1 > 9){ caunt1=0; up1 = true; } if(up1){ caunt2+=1; up1=false; if(caunt2 > 9){ caunt2=0; up2=true; } } if(up2){ caunt3+=1; up2=false; if(caunt3 > 9){ caunt3=0; up3=true; } } if(up3){ caunt4+=1; up3=false; if(caunt4 > 9){ up4=true; } } if(caunt1>0 && caunt1<10){ canvas.drawBitmap(bmp[caunt1], keta[3]*70, 0, null); } if(caunt2>0 && caunt2<10){ canvas.drawBitmap(bmp[caunt2], keta[2]*70, 0, null); } if(caunt3>0 && caunt3<10){ canvas.drawBitmap(bmp[caunt3], keta[1]*70, 0, null); } if(caunt4>0 && caunt4<10){ canvas.drawBitmap(bmp[caunt4], keta[0]*70, 0, null); } if(up4){ canvas.drawBitmap(bmp[9], keta[0]*70, 0, null); canvas.drawBitmap(bmp[9], keta[1]*70, 0, null); canvas.drawBitmap(bmp[9], keta[2]*70, 0, null); canvas.drawBitmap(bmp[9], keta[3]*70, 0, null); } break; } // 現在の状態の変更 canvas.restore(); } // ボタンを押してをカウント描画 public void blue() { caunt1+=1; if(caunt1 > 9){ caunt1=0; up1 = true; } if(up1){ caunt2+=1; up1=false; if(caunt2 > 9){ caunt2=0; up2=true; } } if(up2){ caunt3+=1; up2=false; if(caunt3 > 9){ caunt3=0; up3=true; } } if(up3){ caunt4+=1; up3=false; if(caunt4 > 9){ up4=true; } } flag=1; } //ビットマップの読み込み private static Bitmap readBitmap(Context context, String name) { int resID = context.getResources().getIdentifier( name, "drawable", context.getPackageName()); return BitmapFactory.decodeResource( context.getResources(), resID); } }

【訂正】
すみません、コードの一番上に変数を記入しました。
Bitmapで0~9の画像を入れてます。
// ボタンを押してをカウント描画のところでcaunt1+=1で増やしてflagでswitch文のcaseの//カウントで数字を増やしています。
一桁の数字が9以上になったらup1をtrueにして二桁目をカウントする感じにしています。

説明不足ですみません。また足りないところがあったら指摘してください。

上のプログラミングは一部抜粋ですが、ボタンを押すと1ずつ数字の画像が増えます。最大で9999カウントできます。
でもプログラミング長くなってしまったので、もっと簡単なやり方があったら教えてください。
あと、数字のカウントを15ずつカウントするにはどうしたらよいでしょうか?このやり方だと1つずつのカウントしかできません。

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

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

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

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

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

swordone

2016/05/08 23:59

それぞれの変数の意味、またボタンをおした時どの変数がどうなるのかを教えて下さい。
guest

回答3

0

ベストアンサー

無駄な処理と関数名等の整理をしてみました。

1.描画位置
keta[]={0,1,2,3}としてあるのに中で結局、70という位置を入れてある。
均等配置ならそれもありだけど描画位置が固定なら、もう少し汎用性も考え、座標に変更

java

1private Point mLocation[] = { 2 new Point(0, 0), 3 new Point(70 * 1, 0), 4 new Point(70 * 2, 0), 5 new Point(70 * 3, 0)};

2.カウンターは単純な数値に変更

java

1private int mCounter = 0 2public void countUp() { 3 mCounter++; 4 drawNumber(); // 後述の描画処理 5}

3.描画処理
描画するときに単純にカウンターから1桁づつ取り出す。
例えばカウンターが1034だった場合、下記のような計算で求められるので
(1034 / 1000) % 10 = 1
(1034 / 100) % 10 = 0
(1034 / 10) % 10 = 3
(1034 / 1) % 10 = 4
変動している値は割り算の部分だけなので
(カウンター / x) % 10 となり、xの部分は1→10→100→1000とするのが簡単なので逆順でループしながら描画

java

1 protected void drawNumber() { 2 3 int offset = 1; 4 5 // 逆順で処理 6 for (int i = mLocation.length - 1; i >= 0;i--) { 7 int number = (mCounter / offset) % 10; 8 offset *= 10; 9 canvas.drawBitmap(bmp[number], mLocation[i].x, mLocation[i].y, null); 10 } 11 12 }

最終的に

java

1 // 各桁の描画位置 2 private Point mLocation[] = { 3 new Point(0, 0), 4 new Point(70 * 1, 0), 5 new Point(70 * 2, 0), 6 new Point(70 * 3, 0)}; 7 8 // カウンター 9 private int mCounter = 0; 10 11 /** 12 * カウントアップ処理 13 */ 14 public void countUp() { 15 mCounter++; 16 drawNumber(); 17 } 18 19 /** 20 * 数値の描画 21 */ 22 protected void drawNumber() { 23 24 int offset = 1; 25 26 // 逆順で処理 27 for (int i = mLocation.length - 1; i >= 0;i--) { 28 int number = (mCounter / offset) % 10; 29 offset *= 10; 30 canvas.drawBitmap(bmp[number], mLocation[i].x, mLocation[i].y, null); 31 } 32 33 } 34

といった感じでどうでしょう?
ちなみに5桁や3桁に変更する場合、mLocationの数を修正するだけで対応できます。

>「数字のカウントを15ずつカウントするにはどうしたらよいでしょうか?」
下記関数の修正で大丈夫です。

java

1 /** 2 * カウントアップ処理 3 */ 4 public void countUp() { 5 countUp(1); 6 } 7 /** 8 * カウントアップ処理 9 */ 10 public void countUp(int addValue) { 11 mCounter + = addValue; 12 drawNumber(); 13 }

呼び出し側でcountUp(15);といった感じです。

投稿2016/05/09 15:21

編集2016/05/09 15:40
dekaaki

総合スコア292

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

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

19776340

2016/05/10 12:29

ご回答ありがとうございます。 おかげで凡庸性のあるカウントが作成できました。
guest

0

長くなっていると思う要因はおそらく、画像表示の部分でしょうか?

1.全て0で作画
2.数字が0出ない部分を上書き作画
3.9999より多くなってたら全て9で作画
4.カウントアップされていたらその数字で作画

なんか無駄が多そうですね。
とくに4の部分が無駄に見えてしまいます。

単純な解決としては、カウントをする部分と作画をする部分を分けることです。

「カウントの変数の値更新が終わってから作画」

理想としてはボタンが押された瞬間にその変数が変わっている状態にする。
(blue()内で変数は変えてしまう)

また、変数についてもカウントする部分と画像表示のための部分を意識して分けてしまいましょう。
おそらく、コメントに「画像表示」とあるのでcauntは表示する画像のための変数と考えているのでしょうが、それとは別に(他の方も書いてらっしゃいますが)カウント用の変数を用意するとよいでしょう


これは質問とは関係ないかもしれませんが、
変数についてですが幾つか使い方で気になる部分があります。

java

1for(int i = 0; i < 4; i++) { 2 canvas.drawBitmap(bmp[0], keta[i]*70, 0, null); 3}

keta[i]って普通にiでよいのでは?

java

1private int flag; 2switch ((int)flag) {

flagって普通にboolean でいいのでは?

java

1private boolean up1 = false; // 2桁目の数字をカウント 2private boolean up2 = false; // 3桁目の数字をカウント 3private boolean up3 = false; // 4桁目の数字をカウント 4private boolean up4 = false; // 9999の数字をカウント 5private int caunt1=0; // 画像表示 6private int caunt2=0; // 画像表示 7private int caunt3=0; // 画像表示 8private int caunt4=0; // 画像表示

upもcauntも扱う桁が増えた時にup5,caunt5をつくるのかな?
配列にしてしまったほうが良さそう。

作っている間に各変数の役割がわからなくなって、混乱しているのではないでしょうか。
一度、各変数がどんな役割なのかを意識してみるとよいかもしれません。

投稿2016/05/09 04:13

編集2016/05/09 04:22
RyotaKondo

総合スコア94

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

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

19776340

2016/05/10 12:29

ご回答ありがとうございます。 とりあえず強引に作成してみたら無駄が多くなってしまいました。 今回のご回答を参考に凡庸性のあるものにしていきます。
guest

0

見たところcaunt*(正しく綴るならcount)は数字の各桁を取ってるだけなので、カウント管理の変数はcount一つにして、

java

1count++; 2int[] digit = new int[4]; 3int temp = count; 4for (int i = 0; i < 4; i++) { 5 digit[i] = temp % 10; 6 temp /= 10; 7}

各位の数字を取るのはこれでできます。flagが何をしたいのかがよくわかりませんが…
数字の上がり幅を変えるのもこれなら簡単です。単にcountに足す数字を変えれば済みます。

投稿2016/05/09 00:53

swordone

総合スコア20651

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

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

19776340

2016/05/10 12:32

ご回答ありがとうございます。 flagは別のswitch文でflag1,flag2と分けてるんですが、今回は質問と関係なかったので抜粋しました。 こちらのやり方も参考にしていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問