在Android中调用invalidate()时计时器不工作
我想通过绘制一条灰色、白色(与背景匹配)的路径,然后再绘制一条灰色的路径来创建闪烁效果。我想闪烁3次,显示灰色1秒,显示白色1秒,再次显示灰色1秒,以此类推 当我为在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
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以编程方式更改颜色。您能告诉我“糟糕的编程”是什么意思吗?而且,这张图片是一张照片,我无法想象在语法上改变颜色。