- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个使用自定义 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 );
}
}
}
请给我一些想法,我该怎么办?提前致谢
我不明白为什么我不能对自己的问题添加评论?!?
@Romain Guy:谢谢!好的,我明白了。但我必须将 setText() 与绘图框一起使用。文本标签被覆盖,它们是最上面的。我该怎么办?
最佳答案
每次您在 TextView
上调用 setText()
时,UI 工具包都需要重新布局和重新绘制 UI。由于每次调用 onDraw()
时您都这样做,因此您基本上创建了一个无限绘图循环。
在您的绘制方法中还有其他问题:您不应该每次都执行 findViewById()
,您不应该每次都创建一个新的 SimpleDateFormat
,您不应每次都创建新的 Date
对象,等等。
关于android - 为什么 onDraw() 不断调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14861253/
安卓游戏用什么比较好: 一个带有渲染线程的SurfaceView 或 一个 SurfaceView,带有调用 SurfaceView 函数的线程 doDraw() 谢谢。 最佳答案 SurfaceVi
我花了一整天的时间调试各种将自定义 ViewGroup 添加到另一个自定义 ViewGroup 的方法,但几乎要疯了,因为它们都不起作用,而且没有官方文档或显示如何完成的示例... 基本上,我有 2
我正在尝试创建一个简单的应用程序,绘制一个简单的图形,然后单击按钮后对图形进行一些仿射变换。你能帮我完成 onClick 方法旋转吗?万分感谢。问题是,如果可能的话,我不知道如何从 CanvasVie
我有一个简单的图形应用程序,可以在屏幕上绘制一些内容。之前,我在 onDraw() 中调用 invalidate() 时没有进行检查,没有任何问题。在我的应用程序中, onDraw() 每秒被调用多次
这个问题已经有答案了: Is Java "pass-by-reference" or "pass-by-value"? (91 个回答) 已关闭 9 年前。 我提到了this question但它没有
我有以下代码: @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setCo
我的自定义 View 的 onDraw() 没有被触发。为什么?我正在使用 2.3.3。 View 创建时不应该自动绘制吗? onMeasure() 方法被触发,我得到正确的屏幕宽度和高度。 pack
我正在处理我的 ondraw 方法无法正常工作的应用程序......在我的应用程序中,我正在使用 framelayout ...所以我用了三级...1)活跃度2)图像选择3)绘图 我的图像选择工作正常
我有一个 SurfaceView,我喜欢在其中绘制一堆文本并绘制 72px x 72px 的 png 图像。图像始终绘制在 SurfaceView 上,但每 2 秒在不同的位置绘制一次。 (从该图
在我的自定义绘制 View 中,我使用了 Canvas.drawPaint(Paint) 方法。但 Android Studio 中的预览显示此消息: The graphics preview in
我创建了一个调用 DrawView extends View 的 Activity ,我在 Canvas 上绘制类似于二叉树的东西。 Canvas 尺寸大于屏幕尺寸,onDraw 函数绘制整个 Can
我试图在按下 drawCircle() 时调用 onDraw()。我知道它正在被调用(通过 xml 中的 onClick),因为我收到消息:“drawCircle pressed”。然而,问题是 in
我用一个新类覆盖了 RelativeLayout 类: public class myRelative extends RelativeLayout{ //... //this function is
我在使用 Android 应用程序时遇到问题。 我有一个线程不断迭代列表或形状,更新它们的位置,有时还会从列表中删除一个项目。在线程的 while 循环结束时,它调用 postInvalidate()
我有一个应用程序可以根据人的生日绘制行星和星座。我在自定义 View 中使用 onDraw() 方法,该方法被添加到 XML 中的 FrameLayout。问题是,当我离开页面并调整日期时,该 Act
我正在尝试在 CScrollView 派生类中显示图像: C++ CScrollView, how to scroll an image? 所以我想覆盖OnDraw,将代码从OnPaint 移动到On
我想向 itemView 添加动画,但是它们仅在项目当前正在移动时运行。例如,项目开始淡出,直到 alpha 为 0,但如果项目停止移动,动画就会暂停,项目只会淡出一半。之后,该项目需要再次开始移动才
对于 Android canvas 游戏,我使用以下(最小化)方法请求重绘 SurfaceView: private void refreshView() { c = surf
我正在使用 Android 2.2 构建游戏。主游戏 Activity 使用自定义 SurfaceView: class GameView extends SurfaceView 据我了解,onDra
我的自定义按钮有问题。 onDraw() 被一次又一次地调用,我不明白为什么。 public class CircleButton extends Button { static final
我是一名优秀的程序员,十分优秀!