4

这是问题所在。出于性能原因,我选择使用 SurfaceView 来绘制类似表格的表格,并且因为这些东西充满了数据,所以我使用 ScrollView 作为 SurfaceView 父级。

很高兴看到它在我的个人开发专用手机(HTC Desire HD 2.3.7)上运行良好,我尝试在我公司的一款开发专用手机(Google Nexus S 4.1.?)上对其进行测试,然后在我的个人手机上进行测试(宏达一 X 4.1.1)。

最后两个出现问题,我的 SurfaceView 在大约 80 像素滚动后变黑,然后在我向下滚动到大约 80 像素(取决于屏幕大小)时又变回了它的样子。

为了避免这种停电,我在一些模拟器下进行了测试......

从 2.2(客户的愿望)到 4.0.4,它工作得很好。

笑话是,在 4.2 下……它也有效!

当然,只有在 4.1.x 以下,SurfaceView 才会变黑!

这是我的 SurfaceView 代码,我只是从您可以在此处找到的示例中复制的。

public class MySurfaceView extends SurfaceView
{
    public MySurfaceView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        // I use another SurfaceView behind to draw a grid
        // that is scroll independent with a white background
        this.setZOrderOnTop(true);
        // Same reason here
        this.getHolder().setFormat(PixelFormat.TRANSPARENT);
        this.getHolder().addCallback(this);
        this.getHolder().setSizeFromLayout();
        // Tried without this line and with "software" and "none" types too
        // and hardware acceleration on application and activity
        this.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);

        canvas.drawSomething()...
    }

    public void surfaceCreated(SurfaceHolder holder)
    {
        this.setWillNotDraw(false);

        this.thread = new MySurfaceViewThread(this.getHolder(), this);
        this.thread.setRunning(true);
        this.thread.run();
    }

    public void surfaceDestroyed(SurfaceHolder holder)
    {
        this.thread.setRunning(false);
        boolean retry = true;
        while(retry)
        {
            try
            {
                this.thread.join();
                retry = false;
            }
            catch(Exception exception)
            {
                Log.v(TAG, exception.getClass().getName(), exception);
            }
        }
    }
}
4

1 回答 1

3

这个代码片段可能是一个答案

if(VERSION.SDK_INT != VERSION_CODES.JELLY_BEAN)
{
    this.setZOrderOnTop(true);
}

但是这样做的问题是背景变黑了。

对于这个特定的 android 版本,我也必须在这个“背景”SurfaceView 中绘制网格。

这不是一个好的解决方案,因为在此 SurfaceView 中绘制该网格会破坏滚动和捏合缩放的平滑度。

于 2012-12-19T09:30:16.410 回答