gpt4 book ai didi

android - 为什么 onDraw() 不断调用?

转载 作者:太空宇宙 更新时间:2023-11-03 12:09:54 26 4
gpt4 key购买 nike

我有一个使用自定义 LinearLayout 的小应用程序,称为 LinearlayoutOutlined。我想在其中绘制不同大小和颜色的框。它还具有两个指示时间间隔的文本标签。某些用户操作后必须重新绘制布局。因此我按原样刷新布局

slotPanel.setDayBoundariesInMinutes( db, dw );
TimeSlot[] tSlots = nextDaysSlots.getGaps( dayOfWeek );
slotPanel.setItems( tSlots );
slotPanel.invalidate();

slotpanelLinearLayoutOutlined 实例。

我检测到不断调用 onDraw 方法。它不会在特定次数的循环后停止调用。

这是整个 LinearLayoutOutlined 类:

打包 com.widgets;

public class LinearLayoutOutlined extends LinearLayout {
private int workingTimeBeginsInMinutes;
private int workingTimeFinishesInMinutes;
private TimeSlot[] items;
private Rect outline;
private Paint strokePaint = new Paint();
SimpleDateFormat formatter;
public LinearLayoutOutlined( Context context ) {
super( context );
setWillNotDraw( false );
}
public LinearLayoutOutlined( Context context, AttributeSet attrs ) {
super( context, attrs );
setWillNotDraw( false );
}
public void setWorkingTimeBeginsInMinutes( int m ) {
this.workingTimeBeginsInMinutes = m;
}
public void setWorkingTimeFinishesInMinutes( int m ) {
this.workingTimeFinishesInMinutes = m;
}
public void setDayWidthInMinutes( int dayWidthInMinutes ) {
this.workingTimeFinishesInMinutes = this.workingTimeBeginsInMinutes + dayWidthInMinutes;
}
public void setDayBoundariesInMinutes( int daybeginInMinutes, int dayWidthInMinutes ) {
setWorkingTimeBeginsInMinutes( daybeginInMinutes );
setDayWidthInMinutes( dayWidthInMinutes );
}
private int getWorkingTimeBeginsInMinutes() {
return workingTimeBeginsInMinutes;
}
public int getWorkingTimeFinishesInMinutes() {
return workingTimeFinishesInMinutes;
}
public void setItems( TimeSlot[] items ) {
this.items = items;
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw( Canvas canvas ) {
if( items == null ) return;
// time labels
TextView tvFrom = ( TextView )findViewById( R.id.lblStartingTime ), tvTo = ( TextView )findViewById( R.id.lblFinishingTime );
formatter = new SimpleDateFormat( "HH:mm", Locale.getDefault() );
tvFrom.setText( formatter.format( new Date( getWorkingTimeBeginsInMinutes() * 60000L ) ) );
tvTo.setText( formatter.format( new Date( getWorkingTimeFinishesInMinutes() * 60000L ) ) );
strokePaint.setStyle( Paint.Style.STROKE );
strokePaint.setStrokeWidth( 1 );
strokePaint.setStyle( Style.FILL );
outline = canvas.getClipBounds();
Convert.setDayBoundaries( getWorkingTimeBeginsInMinutes(), getWorkingTimeFinishesInMinutes(), outline );
for( TimeSlot slotItem: items ) {
RectTouchable rect = Convert.ToRect( slotItem );
if( slotItem.isFree() )
strokePaint.setARGB( 255, 0, 255, 0 );
else
strokePaint.setARGB( 255, 255, 0, 0 );
canvas.drawRect( rect.getRect(), strokePaint );
}
}
}

请给我一些想法,我该怎么办?提前致谢


我不明白为什么我不能对自己的问题添加评论?!?

@Romain Guy:谢谢!好的,我明白了。但我必须将 setText() 与绘图框一起使用。文本标签被覆盖,它们是最上面的。我该怎么办?

最佳答案

每次您在 TextView 上调用 setText() 时,UI 工具包都需要重新布局和重新绘制 UI。由于每次调用 onDraw() 时您都这样做,因此您基本上创建了一个无限绘图循环。

在您的绘制方法中还有其他问题:您不应该每次都执行 findViewById(),您不应该每次都创建一个新的 SimpleDateFormat,您不应每次都创建新的 Date 对象,等等。

关于android - 为什么 onDraw() 不断调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14861253/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com