【问题标题】:How to change images one after the other on ImageButtons?如何在 ImageButtons 上一个接一个地更改图像?
【发布时间】:2011-08-17 18:52:13
【问题描述】:

我正在尝试更改按钮上的图像并将它们转回原始图像,并在 4 个不同的图像中一个接一个地进行。

我尝试了以下代码,但没有成功,结果仅导致其中一个图像闪烁一毫秒:

ArrayList<Integer> scenario = new ArrayList<Integer>();

...

void delayedPlay(){
    // each button should be posted in 1 second spacing
    int count = 1;
    for (final int btnid : scenario){
        // turn off
        final Runnable r2 = new Runnable(){
            public void run(){ 
                imagebuttons[btnid].setImageBitmap(imagesTurnedOff.get(btnid)); 
                }
        };

        // turn on and call turn off
        Runnable r1 = new Runnable(){
            public void run(){ 
                imagebuttons[btnid].setImageBitmap(imagesTurnedOn.get(btnid));
                imagebuttons[btnid].postDelayed(r2, 1000);
                }
        };

        // post the above delayed
        imagebuttons[btnid].postDelayed(r1, 1000 * count++);
    }
}

谁能帮助我,并说明为什么它对我不起作用?

【问题讨论】:

    标签: android animation imagebutton


    【解决方案1】:

    它对我有用。您确定 imagesTurnedOn/imagesTurnedOff 返回正确的值吗?

    这个解决方案在时间方面还有很多不足之处——它会很不平衡。也许这样的事情会更好(使用 AsyncTask)

    public void deplayedPlay2() {
        if (mTaskHandler == null) {
            mTaskHandler = new AsyncTask<Void, Void, Void>() {
                @Override
                public Void doInBackground(Void... params) {
                    long now = System.currentTimeMillis();
                    try {
                        for (final int btnid : mScenario) {
                            Log.d(TAG,
                                    "ON: " + btnid + " (" + (System.currentTimeMillis() - now) + ")");
                            mButtons[btnid].post(new Runnable() {
                                public void run() {
                                    mButtons[btnid]
                                            .setBackgroundDrawable(GoodbyeAndroidActivity.this
                                                    .getResources()
                                                    .getDrawable(
                                                            R.drawable.on_icon));
    
                                }
                            });
                            Thread.sleep(1000);
                            Log.d(TAG,
                                    "OFF: " + btnid + " (" + (System.currentTimeMillis() - now) + ")");
                            mButtons[btnid].post(new Runnable() {
                                public void run() {
                                    mButtons[btnid]
                                            .setBackgroundDrawable(GoodbyeAndroidActivity.this
                                                    .getResources()
                                                    .getDrawable(
                                                            R.drawable.off_icon));
                                }
                            });
                        }
                    } catch (InterruptedException ex) {
                        Log.d(TAG, "Interrupted.");
                    }
                    return null;
                }
    
                @Override
                public void onPostExecute(Void param) {
                    Log.d(TAG, "Done!");
                    mTaskHandler = null;
                }
            };
            mTaskHandler.execute();
        }
    }
    

    不要忘记在 onPause() 中处理这个:

    public void onPause() {
        super.onPause();
        if (mTaskHandler != null) {
            mTaskHandler.cancel(true);
            // May want to reset buttons too?
        }
    }
    

    【讨论】:

    • 漂亮!奇迹般有效!谢谢!顺便说一句 - 你为什么写:long now = System.currentTimeMillis(); ?
    • 我想查看与 AsyncTask 启动时间相关的时间——它仅在 Log.d 消息中使用。我在测试原始实现时放入了该代码。它奏效了,但正如我所说,时间安排非常不平衡。很高兴它对你有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多