android调用ondraw,android – 为什么onDraw()不断调用?

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

slotPanel.setDayBoundariesInMinutes( db, dw );

TimeSlot[] tSlots = nextDaysSlots.getGaps( dayOfWeek );

slotPanel.setItems( tSlots );

slotPanel.invalidate();

其中slotpanel是LinearLayoutOutlined实例.

我检测到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 );

}

}

}

请给我一些想法,我该怎么办?

Thanx提前

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

@Romain Guy:

谢谢!好的,我明白了.但我必须将setText()与drawin框一起使用.文本标签被覆盖,它们是最顶层的.我该怎么办?

解决方法:

每次在TextView上调用setText()时,UI工具包都需要重新布局并重新绘制UI.因为每次调用onDraw()时都会这样做,所以你基本上创建了一个无限的绘图循环.

你的draw方法中还有其他问题:你不应该每次都做一个findViewById(),你不应该每次都创建一个新的SimpleDateFormat,你不应该每次都创建新的Date对象,等等.

标签:android,android-linearlayout

来源: https://codeday.me/bug/20190725/1535630.html