我在onDraw()方法的自定义视图中绘制了三件事:可绘制矢量,简单直线和三角形(由4个点和一个路径组成)。此自定义视图显示在选项卡中。
如果我滑动以转到另一个选项卡,则会看到系统调用onDraw()。当返回保留我的自定义视图的选项卡时,可绘制的矢量和简单的线条仍然可见,但三角形消失了。如果现在我滑动到另一个选项卡,则onDraw()再次运行,并返回到带有自定义视图的选项卡中,所有项目(包括三角形)现在都可见。当我来回滑动时,这种消失/出现继续发生。为什么我的三角形消失了?
更新1(错误修复):我尝试进行实验,注意到当我将三角形Path对象创建从init()方法中移出并将其直接放在onDraw()方法中时-一切正常,什么都没有消失。但是,当我在onDraw();中创建此对象时,我现在收到“避免在绘制期间分配对象”警告。
UPDATE 2(更好的修复程序?):
经过更多的实验,肯定是导致此问题的路径。另一个解决方案-不会产生“在绘制期间避免对象分配”警告:将路径创建保留在init()中,并删除代码行“ myPath.setFillType(Path.FillType.EVEN_ODD)”。它解决了我的问题,但我不知道为什么。protected void onDraw(Canvas canvas) { super.onDraw(canvas); // Co-ordinates int width = getWidth(); int halfWidth = width/2; int left = 0; int top = 0; int centreX = left + halfWidth; int centreY = top + halfWidth; int baseSize = Math.round((float)(halfWidth * 0.05)); // Vector drawable - always draws fine! myVectorDrawable.setBounds(left, top, left + width, top + width); myVectorDrawable.draw(canvas); // Simple line - always draws fine! canvas.drawLine(left, top, 20, 20, paint); // Triangle - sometimes visible, sometimes disappears! Point myTriangleBottomMiddle = new Point(centreX, centreY); Point myTriangleBottomLeft = new Point(centreX, centreY + baseSize); Point myTriangleBottomRight = new Point(centreX, centreY - baseSize); Point myTriangleTopMiddle = new Point(centreX + halfWidth, centreY); myPath.moveTo(myTriangleBottomMiddle.x, myTriangleBottomMiddle.y); myPath.lineTo(myTriangleBottomLeft.x, mTriangleBottomLeft.y); myPath.lineTo(myTriangleTopMiddle.x, myTriangleTopMiddle.y); myPath.lineTo(myTriangleBottomRight.x, myTriangleBottomRight.y); mPath.close(); canvas.drawPath(myPath, myPaint); }
在我下面设置东西的代码下面,以免增加onDraw()方法的负担。
private void init() {
// Vector drawable
myVectorDrawable = r.getDrawable(R.drawable.gauge_dial);
// Triangle path - ** THIS BEING HERE SEEMS TO BE THE PROBLEM **
myPath = new Path();
myPath.setFillType(Path.FillType.EVEN_ODD);
// Triangle Paint
myPaint = new Paint();
myPaint.setColor(r.getColor(R.color.black));
myPaint.setStrokeWidth(2);
myPaint.setAntiAlias(true);
myPaint.setStyle(Paint.Style.FILL);
// Simple line paint
Paint paint = new Paint();
paint.setColor(Color.BLACK);
}
我在onDraw()方法的自定义视图中绘制了三件事:可绘制矢量,简单直线和三角形(由4个点和一个路径组成)。此自定义视图显示在选项卡中。如果我滑动到...
在路径上添加对reset()的调用。