在Android中调用invalidate()时计时器不工作

在Android中调用invalidate()时计时器不工作,android,timer,ondraw,flashing,android-view-invalidate,Android,Timer,Ondraw,Flashing,Android View Invalidate,我想通过绘制一条灰色、白色(与背景匹配)的路径,然后再绘制一条灰色的路径来创建闪烁效果。我想闪烁3次,显示灰色1秒,显示白色1秒,再次显示灰色1秒,以此类推 当我为postDelayed()创建处理程序时,程序跳过了run(),没有在计时集中执行它,并且没有发生闪烁: final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override

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

当我为
postDelayed()
创建
处理程序时,程序跳过了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次


谢谢

你可以试试这样的东西

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);

否则,你有很多其他的例子,像这样,等等,让我知道,如果你仍然需要帮助

你可以试试这样的东西

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);

否则,你有很多其他的例子,像这样,等等,让我知道,如果你仍然需要帮助

这是一个工作代码示例,说明如何将地球仪从蓝色闪烁到红色,然后再闪烁回来。您可以修改内部的代码,以限制所需的次数和延迟时间

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);
        }
    }

}
受保护的MyGlobeFlashHandler手柄FlashGlobe=新的MyGlobeFlashHandler(此);
@凌驾
受保护的onCreate(Bundle){
handlerFlashGlobe.sendEmptyMessageDelayed(0700);
}
/**
*私有静态处理程序,因此没有泄漏的活动。
*/
受保护的静态类MyGlobeFlashHandler扩展处理程序{
私人最终参考活动;
公共MyGlobeFlashHandler(HomeBase活动){
this.activity=新的WeakReference(activity);
}
@凌驾
公共无效handleMessage(消息消息消息){
超级handleMessage(msg);
if(activity.get()!=null){
if(activity.get().shadegLobe){
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue));
}否则{
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red));
}
activity.get().shadegLobe=!activity.get().shadegLobe;
sendEmptyMessageDelayed(0700);
}
}
}

这是一个工作代码示例,说明如何将地球仪从蓝色闪烁到红色,然后再闪烁回来。您可以修改内部的代码,以限制所需的次数和延迟时间

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);
        }
    }

}
受保护的MyGlobeFlashHandler手柄FlashGlobe=新的MyGlobeFlashHandler(此);
@凌驾
受保护的onCreate(Bundle){
handlerFlashGlobe.sendEmptyMessageDelayed(0700);
}
/**
*私有静态处理程序,因此没有泄漏的活动。
*/
受保护的静态类MyGlobeFlashHandler扩展处理程序{
私人最终参考活动;
公共MyGlobeFlashHandler(HomeBase活动){
this.activity=新的WeakReference(activity);
}
@凌驾
公共无效handleMessage(消息消息消息){
超级handleMessage(msg);
if(activity.get()!=null){
if(activity.get().shadegLobe){
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue));
}否则{
activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red));
}
activity.get().shadegLobe=!activity.get().shadegLobe;
sendEmptyMessageDelayed(0700);
}
}
}

为什么不试试timertask?我该怎么做?你能给我举个例子吗?你为什么不试试timertask?我该怎么做?你能给我举个例子吗?嗨,克里斯蒂,这里你用两个不同的图像来制作动画。这不是很好的编程实践;理想情况下,您可能希望设置一个.png文件并通过使用
setIndent()
@Eddev以编程方式更改颜色。您能告诉我“糟糕的编程”是什么意思吗?另外,这张图片是一张照片,我无法想象在语法上改变颜色。嗨,克里斯蒂,这里你用两张不同的图片来制作动画。这不是很好的编程实践;理想情况下,您可能希望设置一个.png文件并通过使用
setIndent()
@Eddev以编程方式更改颜色。您能告诉我“糟糕的编程”是什么意思吗?而且,这张图片是一张照片,我无法想象在语法上改变颜色。