android:动态刷新imageview

android:动态刷新imageview,android,multithreading,imageview,refresh,runnable,Android,Multithreading,Imageview,Refresh,Runnable,我有一个关于imageview刷新的问题。基本上,我有一个按钮和一个骰子。我希望骰子旋转几次(模拟掷骰子)-0.5秒,最后停止。问题是:我只能看到最后的结果。正在进行骰子滚动模拟,但未显示更改(未刷新imageview)。我认为这是我对应该如何实施的错误理解 我在一个简单的项目中隔离了这个问题,几行代码,您可以在这里下载(如果您有时间玩的话): 整个代码如下所示: package com.viscode.vrtiKocku; 导入java.util.Random; 导入android.app.

我有一个关于imageview刷新的问题。基本上,我有一个按钮和一个骰子。我希望骰子旋转几次(模拟掷骰子)-0.5秒,最后停止。问题是:我只能看到最后的结果。正在进行骰子滚动模拟,但未显示更改(未刷新imageview)。我认为这是我对应该如何实施的错误理解

我在一个简单的项目中隔离了这个问题,几行代码,您可以在这里下载(如果您有时间玩的话):

整个代码如下所示:


package com.viscode.vrtiKocku;
导入java.util.Random;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Handler;
导入android.view.view;
导入android.widget.Button;
导入android.widget.ImageView;
公共类VrtiKockuActivity扩展活动{
/**在首次创建活动时调用*/
私有最终处理程序mHandler=新处理程序();
Random randomGenerator=新的Random();
私有图像视图1;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dice1=(ImageView)findViewById(R.id.imageView1);
mHandler.post(mRollDice);
}
private final Runnable mRollDice=new Runnable(){
公开募捐{
Button buttonRollDice=(Button)findViewById(R.id.buttonRollDice);
buttonRollDice.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
整数rand,rollSimulationTimeLimit=500,rollDuration=100;;
//模拟掷骰子500毫秒,100毫秒时掷5次骰子
而(rollDuration


使用处理程序的postDelayed而不是线程

  package com.viscode.vrtiKocku;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class VrtiKockuActivity extends Activity {
    /** Called when the activity is first created. */

    private final Handler mHandler = new Handler(); // handler
    Random randomGenerator = new Random(); // varijabla tipa random
    Boolean kocka1pritisnuta = false; // da li je kocka zakljucana ili ne
    Integer vkocka1; // drzi vrijednost kocke
    private ImageView kocka1; // varijabla imageview-a

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        kocka1 = (ImageView) findViewById(R.id.imageView1); // inicijalizira
                                                            // imageview
        mHandler.post(mBacaj); // pokrece handler
    }

    private final Runnable mBacaj = new Runnable() {

        public void run() {
            Button buttonBacaj = (Button) findViewById(R.id.buttonBacaj); // veze
                                                                            // button
                                                                            // za
                                                                            // varijablu
            buttonBacaj.setOnClickListener(new View.OnClickListener() { // postavlja
                                                                        // listener
                                                                        // na
                                                                        // dugme

                        public void onClick(View v) { // definise click event
                            // TODO Auto-generated method stub
                            Integer rand; // varijabla koja drzi rand broj
                            vrtiKocke(); // pokreni VRCENJE KOCKI

                            if (!kocka1pritisnuta) { // ako kocka nije
                                                        // zakljucana...
                                rand = randomGenerator.nextInt(6) + 1; // generisi
                                                                        // random
                                                                        // broj
                                vkocka1 = rand; // zapamti vrijednost da mozes
                                                // racunat poslije
                                postaviKocku(rand, kocka1,0); // postavi sliku
                                                            // kocke koja
                                                            // odgovara
                                                            // vrijednosti
                            }
                        }
                    });

            final ImageView kocka1 = (ImageView) findViewById(R.id.imageView1); // povezi
                                                                                // imageview
                                                                                // sa
                                                                                // kockom
            kocka1.setOnClickListener(new View.OnClickListener() { // postavi
                                                                    // listener
                                                                    // na kocku
                public void onClick(View v) { // definisi click event za kocku
                    kocka1pritisnuta = pritisniKocku(kocka1pritisnuta, kocka1); // izvrsi
                                                                                // click
                                                                                // event
                                                                                // za
                                                                                // kocku
                }
            });
        }
    };

    // ova procedura treba da vrti kocke do 500 milisekundi, trajanje je po 100
    // ms, znaci 5x se trabaju okrenuti
    private void vrtiKocke() {
        Integer rand, limit = 1000, trajanje = 200;
        while (trajanje < limit) {
            if (!kocka1pritisnuta) {
                rand = randomGenerator.nextInt(6) + 1;
                postaviKocku(rand, kocka1, trajanje);
            }

            rand = randomGenerator.nextInt(100);
            // cekaj vrijeme trajanja

            trajanje += trajanje;
        }
    }

    // ova procedura postavlja vrijednost kocke na onu vrijednost broja koji je
    // dobiven
    private void postaviKocku(final Integer rand, final ImageView kocka, Integer trajanje) {
        //Log.i("kocka", rand+"");
        switch (rand) {
        case 1:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.one_red));
                }
            }, trajanje);
            break;
        case 2:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.two_red));
                }
            }, trajanje);
            break;
        case 3:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.three_red));
                }
            }, trajanje);
            break;
        case 4:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.four_red));
                }
            }, trajanje);
            break;
        case 5:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.five_red));
                }
            }, trajanje);
            break;
        case 6:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.six_red));
                }
            }, trajanje);
            break;
        default:
            break;
        }
    }

    // ova procedura samo zakljucava ili otkljucava kocku
    private boolean pritisniKocku(boolean kockapritisnuta, ImageView kocka) {
        if (!kockapritisnuta) {
            kocka.setAlpha(128);
        } else
            kocka.setAlpha(255);
        return !kockapritisnuta;
    }

}
package com.viscode.vrtiKocku;
导入java.util.Random;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Handler;
导入android.util.Log;
导入android.view.view;
导入android.widget.Button;
导入android.widget.ImageView;
公共类VrtiKockuActivity扩展活动{
/**在首次创建活动时调用*/
私有最终处理程序mHandler=新处理程序();//处理程序
Random randomGenerator=new Random();//varijabla tipa Random
布尔值kocka1pritisnuta=false;//dali je kocka zakljucana iline
整数vkocka1;//drzi vrijednost kocke
私有ImageView kocka1;//varijabla ImageView-a
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
kocka1=(ImageView)findViewById(R.id.imageView1);//inicijalizira
//图像视图
mHandler.post(mBacaj);//pokrece handler
}
私有最终可运行mBacaj=新可运行(){
公开募捐{
Button ButtonBaaj=(Button)findViewById(R.id.ButtonBaaj);//veze
//钮扣
//za
//瓦里贾布鲁
ButtonBaaj.setOnClickListener(新视图.OnClickListener(){//postavlja
//听众
//na
//达格米
公共void onClick(视图v){//定义单击事件
//TODO自动生成的方法存根
整数兰德;//varijabla koja drzi rand broj
vrtiKocke();//pokreni VRCENJE KOCKI
如果(!kocka1pritisnuta){//ako kocka nije
//扎克尔朱卡纳。。。
rand=randomGenerator.nextInt(6)+1;//generisi
//随机的
  package com.viscode.vrtiKocku;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class VrtiKockuActivity extends Activity {
    /** Called when the activity is first created. */

    private final Handler mHandler = new Handler(); // handler
    Random randomGenerator = new Random(); // varijabla tipa random
    Boolean kocka1pritisnuta = false; // da li je kocka zakljucana ili ne
    Integer vkocka1; // drzi vrijednost kocke
    private ImageView kocka1; // varijabla imageview-a

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        kocka1 = (ImageView) findViewById(R.id.imageView1); // inicijalizira
                                                            // imageview
        mHandler.post(mBacaj); // pokrece handler
    }

    private final Runnable mBacaj = new Runnable() {

        public void run() {
            Button buttonBacaj = (Button) findViewById(R.id.buttonBacaj); // veze
                                                                            // button
                                                                            // za
                                                                            // varijablu
            buttonBacaj.setOnClickListener(new View.OnClickListener() { // postavlja
                                                                        // listener
                                                                        // na
                                                                        // dugme

                        public void onClick(View v) { // definise click event
                            // TODO Auto-generated method stub
                            Integer rand; // varijabla koja drzi rand broj
                            vrtiKocke(); // pokreni VRCENJE KOCKI

                            if (!kocka1pritisnuta) { // ako kocka nije
                                                        // zakljucana...
                                rand = randomGenerator.nextInt(6) + 1; // generisi
                                                                        // random
                                                                        // broj
                                vkocka1 = rand; // zapamti vrijednost da mozes
                                                // racunat poslije
                                postaviKocku(rand, kocka1,0); // postavi sliku
                                                            // kocke koja
                                                            // odgovara
                                                            // vrijednosti
                            }
                        }
                    });

            final ImageView kocka1 = (ImageView) findViewById(R.id.imageView1); // povezi
                                                                                // imageview
                                                                                // sa
                                                                                // kockom
            kocka1.setOnClickListener(new View.OnClickListener() { // postavi
                                                                    // listener
                                                                    // na kocku
                public void onClick(View v) { // definisi click event za kocku
                    kocka1pritisnuta = pritisniKocku(kocka1pritisnuta, kocka1); // izvrsi
                                                                                // click
                                                                                // event
                                                                                // za
                                                                                // kocku
                }
            });
        }
    };

    // ova procedura treba da vrti kocke do 500 milisekundi, trajanje je po 100
    // ms, znaci 5x se trabaju okrenuti
    private void vrtiKocke() {
        Integer rand, limit = 1000, trajanje = 200;
        while (trajanje < limit) {
            if (!kocka1pritisnuta) {
                rand = randomGenerator.nextInt(6) + 1;
                postaviKocku(rand, kocka1, trajanje);
            }

            rand = randomGenerator.nextInt(100);
            // cekaj vrijeme trajanja

            trajanje += trajanje;
        }
    }

    // ova procedura postavlja vrijednost kocke na onu vrijednost broja koji je
    // dobiven
    private void postaviKocku(final Integer rand, final ImageView kocka, Integer trajanje) {
        //Log.i("kocka", rand+"");
        switch (rand) {
        case 1:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.one_red));
                }
            }, trajanje);
            break;
        case 2:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.two_red));
                }
            }, trajanje);
            break;
        case 3:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.three_red));
                }
            }, trajanje);
            break;
        case 4:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.four_red));
                }
            }, trajanje);
            break;
        case 5:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.five_red));
                }
            }, trajanje);
            break;
        case 6:
            mHandler.postDelayed(new Runnable() {
                public void run() {
                    Log.i("kocka", rand+"");
                    kocka.setImageDrawable(getResources().getDrawable(R.drawable.six_red));
                }
            }, trajanje);
            break;
        default:
            break;
        }
    }

    // ova procedura samo zakljucava ili otkljucava kocku
    private boolean pritisniKocku(boolean kockapritisnuta, ImageView kocka) {
        if (!kockapritisnuta) {
            kocka.setAlpha(128);
        } else
            kocka.setAlpha(255);
        return !kockapritisnuta;
    }

}