【问题标题】:Timer not working in Android when calling invalidate()调用 invalidate() 时计时器在 Android 中不起作用
【发布时间】:2016-08-10 19:47:50
【问题描述】:

我想通过用灰色、白色(与背景匹配)然后再次灰色绘制路径来创建闪烁效果。我想闪3次,显示灰1秒,白1秒灰1秒,等等。

当我为postDelayed()创建了Handler时,程序跳过了run(),并没有在时序集中执行,也没有出现闪退:

final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                invalidate(); //calls onDraw()
                Log.d(TAG, "Flashing now now");
            }
        }, 1000);

如何用计时器实现这样的闪烁功能并闪烁 3 次?

谢谢!

【问题讨论】:

  • 为什么不试试 timertask 呢?
  • 我该怎么做?可以举个例子吗?

标签: android timer ondraw flashing android-view-invalidate


【解决方案1】:

你可以试试这样的,

int delay = 5000; // delay for 5 sec.

int period = 1000; // repeat every sec.

Timer timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask() {

public void run() {

System.out.println("done}

}, delay, period);

否则,您还有很多其他示例可供参考,例如 Example 1Example 2Example 3 等。如果您仍然需要帮助,请告诉我。

【讨论】:

    【解决方案2】:

    这是一个工作代码示例,展示了我们如何将地球仪从蓝色变为红色并再次闪烁。你可以修改里面的代码来限制你想要的次数和时间延迟。

    protected MyGlobeFlasherHandler handlerFlashGlobe = new MyGlobeFlasherHandler(this);
    
    @Override
    protected onCreate(Bundle bundle) { 
           handlerFlashGlobe.sendEmptyMessageDelayed(0, 700);
    }
    
    /**
     * private static handler so there are no leaked activities.
     */
    protected static class MyGlobeFlasherHandler extends Handler {
    
    
            private final WeakReference<HomeBase> activity;
    
            public MyGlobeFlasherHandler(HomeBase activity) {
                this.activity = new WeakReference<HomeBase>(activity);
            }
    
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
    
            if (activity.get() != null) {
                if (activity.get().shadedGlobe) {
                    activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue));
                } else {
                    activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red));
                }
    
                activity.get().shadedGlobe = !activity.get().shadedGlobe;
    
                sendEmptyMessageDelayed(0, 700);
            }
        }
    
    }
    

    【讨论】:

    • 嗨,Kristy,您正在使用两个不同的图像制作动画。那不是很好的编程习惯。理想情况下,您可能希望设置一个 .png 文件并通过可能使用 setIndent() 以编程方式更改颜色。
    • @Eddev 你能告诉我你所说的“糟糕的编程”是什么意思吗?此外,图像是照片,我无法想象以编程方式改变颜色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    相关资源
    最近更新 更多