在自定义视图中绘制的项目onDraw()不断消失

问题描述 投票:0回答:1

我在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个点和一个路径组成)。此自定义视图显示在选项卡中。如果我滑动到...

android android-custom-view ondraw
1个回答
1
投票

在路径上添加对reset()的调用。

© www.soinside.com 2019 - 2024. All rights reserved.