如何从适配器使用SurfaceView(Android)

时间:2014-11-28 18:08:57

标签: android draw surfaceview android-adapter baseadapter

我有一个GridView。我希望每个项目都是从SurfaceView派生的对象。我创建了一个扩展SurfaceView的类,以及一个getView()返回此实例的适配器。

我得到的只是每个网格项目的黑色方块。从不调用SurfaceView的draw()(通过添加跟踪显示),也不是它的surfaceCreated()。

如何以允许我在SurfaceView上绘制内容的方式来执行此操作?我认为问题的关键是从不调用surfaceCreated()。为什么不呢?

这是我的适配器:

public class LevelAdapter extends BaseAdapter
{
    ...
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        LevelNumberView number = new LevelNumberView(m_context);
        number.setLayoutParams(new GridView.LayoutParams(70, 70));
        number.setPadding(1, 1, 1, 1);
        number.masDraw();   // Experiment - but it doesn't work
        return number;
    }

}

然后我的SurfaceView类:

public class LevelNumberView extends SurfaceView
                             implements SurfaceHolder.Callback
{
    ...
    @Override
    public void surfaceCreated(SurfaceHolder holder)
    {
        m_surfaceHolder = holder;
    }

    @Override
    public void draw(Canvas canvas)
    {
        Log.i("LevelNumberView","Draw");
        doDraw(canvas, Color.YELLOW);
    }

    public void masDraw()
    {
        Log.i("LevelNumberView","masDraw");
        if (null != m_surfaceHolder)
        {
            Canvas canvas = m_surfaceHolder.lockCanvas();
            if (null != canvas)
            {
                doDraw(canvas, Color.GREEN);

                m_surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }

    private void doDraw(Canvas canvas, int colour)
    {
        int w = canvas.getWidth();
        int h = canvas.getHeight();
        int min = Math.min(w,h);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(colour);
        paint.setStyle(Paint.Style.FILL);

        canvas.drawCircle(w/2, h/2, min, paint);
    }
}

谢谢! -Mark

1 个答案:

答案 0 :(得分:1)

覆盖draw()可能不是你想要的。如果要在视图上绘制,请覆盖onDraw()。如果你想在Surface上绘图,那通常是从一个单独的线程完成的。 (SurfaceView有两个部分;表面部分是一个完全独立的层,使用基于视图的UI在图层后面绘制。)

如果你还没有调用SurfaceHolder().addCallback(),没有对象会接收回调 - SurfaceView不会向自己发送回调,所以继承SurfaceView并没有为你做太多的事。

也许你想要的只是一个custom View