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

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

ただいまの
回答率

88.36%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,593

19776340

score 17

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つずつのカウントしかできません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2016/05/09 08:59

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

    キャンセル

回答 3

checkベストアンサー

0

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

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

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

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

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

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とするのが簡単なので逆順でループしながら描画

protected void drawNumber() {

        int offset = 1;

        // 逆順で処理
        for (int i = mLocation.length - 1; i >= 0;i--) {
            int number = (mCounter / offset) % 10;
            offset *= 10;
            canvas.drawBitmap(bmp[number], mLocation[i].x, mLocation[i].y, null);
        }

    }

最終的に

// 各桁の描画位置
    private Point mLocation[] = {
        new Point(0, 0), 
        new Point(70 * 1, 0), 
        new Point(70 * 2, 0), 
        new Point(70 * 3, 0)};

    // カウンター
    private int mCounter = 0;

    /**
     * カウントアップ処理
     */
    public void countUp() {
        mCounter++;
        drawNumber();
    }

    /**
     * 数値の描画
     */
    protected void drawNumber() {

        int offset = 1;

        // 逆順で処理
        for (int i = mLocation.length - 1; i >= 0;i--) {
            int number = (mCounter / offset) % 10;
            offset *= 10;
            canvas.drawBitmap(bmp[number], mLocation[i].x, mLocation[i].y, null);
        }

    }


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

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

/**
     * カウントアップ処理
     */
    public void countUp() {
        countUp(1);
    }
    /**
     * カウントアップ処理
     */
    public void countUp(int addValue) {
        mCounter + = addValue;
        drawNumber();
    }


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/10 21:29

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

    キャンセル

0

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

count++;
int[] digit = new int[4];
int temp = count;
for (int i = 0; i < 4; i++) {
    digit[i] = temp % 10;
    temp /= 10;
}


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/10 21:32

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

    キャンセル

0

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

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

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

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

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

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

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


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

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


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

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


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

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;          // 画像表示


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/10 21:29

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

    キャンセル

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

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る