http://shazhuzhu1.iteye.com/blog/971193
android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用。
Android程序中可以使用的界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面。
1,利用invalidate()刷新界面
实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新;而在线程中通过sendMessage发送界面更新消息。
// 在onCreate()中开启线程
new Thread(new GameThread()).start();、
// 实例化一个handler
Handler myHandler = new Handler() {
// 接收到消息后处理
public void handleMessage(Message msg) {
switch (msg.what) {
case Activity01.REFRESH:
mGameView.invalidate(); // 刷新界面
break;
}
super.handleMessage(msg);
}
};
class GameThread implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
Message message = new Message();
message.what = Activity01.REFRESH;
// 发送消息
Activity01.this.myHandler.sendMessage(message);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
2,使用postInvalidate()刷新界面
使用postInvalidate则比较简单,不需要handler,直接在线程中调用postInvalidate即可。
class GameThread implements Runnable {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
// 使用postInvalidate可以直接在线程中更新界面
mGameView.postInvalidate();
}
}
}
分享到:
相关推荐
可以调用`invalidate()`或`postInvalidate()`来触发`onDraw()`的调用,重新绘制控件。 5. **性能优化** - **避免过度绘制**:确保只在必要时更新曲线,避免频繁调用`invalidate()`导致过度绘制,影响性能。 - **...
确保它们在拖动和缩放时能够正确响应和更新位置。 6. **性能优化**: 对于性能敏感的应用,使用硬件加速(setLayerType(View.LAYER_TYPE_HARDWARE, null))可以提高绘图效率。同时,合理使用invalidate()和...
避免在`onTouchEvent`中执行耗时的操作,考虑使用`postInvalidate()`异步刷新界面,而不是立即调用`invalidate()`。 8. **兼容性测试**: 确保自定义拖动控件在不同设备和Android版本上表现一致,进行广泛的设备和...
9. **性能优化**:自定义控件需要关注性能问题,如避免在`onDraw()`中执行耗时操作,合理使用`invalidate()`和`postInvalidate()`刷新视图,以及优化测量和布局过程。 10. **测试和调试**:使用Android Studio的...
为了让时钟实时更新,我们需要在`MyClock`类中添加一个`Runnable`,并在`postInvalidate()`方法中定时调用它,以便每秒刷新一次时钟。 ```java private final Runnable updateTask = new Runnable() { @Override ...
调用invalidate()或postInvalidate()方法可以触发控件的重绘,但需要注意的是,频繁的重绘会消耗大量性能。因此,合理控制重绘时机和优化绘制过程至关重要。此外,理解View的测量(onMeasure())、布局(onLayout()...
合理使用`invalidate()`和`postInvalidate()`方法请求视图更新。 10. **复用与封装**: 优秀的自定义控件设计应考虑可复用性和模块化。将通用功能封装成独立的组件,可以提高代码的可维护性。 综上所述,自定义...
4. **设置和更新状态**:根据应用的需求,可能需要实现一些方法来设置或更新控件的状态,如`setProgress()`方法用于设置进度值。确保这些方法能够触发`invalidate()`或`postInvalidate()`,以使视图重绘。 5. **...
在开发过程中,开发者可能还会遇到性能优化的问题,例如使用`硬件加速`,避免不必要的重绘,以及通过`postInvalidate()`代替`invalidate()`来提高效率。 总的来说,"仿QQ消息提醒的自定义控件"是一个涉及Android UI...
`Invalidate()`或`postInvalidate()`方法用于告诉Android系统View需要更新其显示内容。在自定义View中,我们需要在`onDraw()`方法中正确地处理这些新的数据,并根据数据的变化重新绘制文字。 文件名中的“自定义...
可以利用硬件加速、适时使用postInvalidate()代替invalidate()等手段提高性能。 最后,别忘了编写详细的文档和示例代码,以便其他开发者理解和使用你的自定义控件。可以将这些资料发布到开源社区,如CSDN、GitHub等...
本例展示了如何使用Android中的自定义View来实现带圆点的半圆形进度条,并且详细介绍了自定义View的基本结构、进度条的绘制、圆点的绘制、进度条的更新、Invalidate和postInvalidate的区别、自定义属性的使用和...
可以利用`View`的`setWillNotDraw()`方法控制是否需要重绘,以及使用`View.postInvalidate()`而非`View.invalidate()`来延迟重绘。 总之,创建一个类似电表数字变化的自定义控件是Android开发中提高应用独特性和...
在Android开发中,自定义控件是提升应用界面独特性和用户体验的重要手段。"迈速表",正如其名,是一种模拟汽车迈速表或者进度条的UI组件,它允许开发者根据自己的需求定制显示速度或进度的方式,使得界面更加生动、...
1. 使用postInvalidate()方法在动画每一帧结束后刷新视图,而不是频繁地调用invalidate(),避免过度绘制。 2. 通过设置interpolator来调整动画的速度变化,比如线性插值器可以使动画匀速进行,而...
这些API的实现会涉及调用`invalidate()`或`postInvalidate()`方法来触发视图的重绘。 在实际开发中,为了提高性能和减少不必要的重绘,`BatteryView`可能利用了`Canvas`的缓存机制,比如使用`BitmapShader`来绘制...
- 每个帧的更新中,增加小球的角度,然后根据新的角度计算位置,并调用`invalidate()`方法触发重新绘制。 4. **动画与帧率控制** - Android的动画可以通过`postInvalidate()`或`Handler`来实现。在`onDraw()`结束...
如果需要动态改变UI,优先考虑使用`postInvalidate()`而不是`invalidate()`,以防止不必要的重绘。 9. **测试与调试**: 编写单元测试和UI测试以确保控件的功能正常,同时使用Android Studio的布局编辑器检查控件...
- 使用`invalidate()`或`postInvalidate()`方法来请求重绘,但注意避免频繁调用导致不必要的资源消耗。 - 考虑使用硬件加速,通过在`View`的构造函数中调用`setLayerType(View.LAYER_TYPE_HARDWARE, null)`来开启...
合理地复用View,避免在`onDraw()`中执行耗时操作,可以使用`postInvalidate()`代替`invalidate()`来延迟重绘。 7. **自定义属性**: 为了使MyWheel易于配置,可以定义一些自定义属性,如滚动速度、轮播间隔、动画时...