在Android开发中,invalidate()
和requestLayout()
是View类中用于更新UI的两个关键方法:
onDraw()
方法的调用,不会改变视图的布局或大小。onMeasure()
和onLayout()
的调用,可能也会导致重绘。在API 25(Android 7.1)上,开发者可能会遇到视图无效(invalidate)后没有正确重绘的问题。这通常表现为:
invalidate()
后视图没有更新invalidate()
调用被合并或延迟// 正确方式
view.post(new Runnable() {
@Override
public void run() {
view.invalidate();
}
});
// 或者
runOnUiThread(new Runnable() {
@Override
public void run() {
view.invalidate();
}
});
// 在非UI线程中使用
view.postInvalidate();
// 带延迟的无效
view.postInvalidateDelayed(16); // 约60FPS
// 指定需要重绘的矩形区域
view.invalidate(left, top, right, bottom);
if (view.getVisibility() == View.VISIBLE && view.isAttachedToWindow()) {
view.invalidate();
}
view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
view.invalidate();
view.setLayerType(View.LAYER_TYPE_NONE, null);
view.animate()
.alpha(0.5f)
.setDuration(300)
.start();
invalidate()
SurfaceView
或TextureView
ViewTreeObserver
监听布局变化onDraw()
方法@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 自定义绘制代码
// 避免在此方法中分配对象
}
这些问题通常出现在:
通过理解这些底层机制和采用适当的解决方案,可以确保在API 25及更高版本上获得流畅的UI体验。
没有搜到相关的文章