我有一个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
答案 0 :(得分:1)
覆盖draw()
可能不是你想要的。如果要在视图上绘制,请覆盖onDraw()
。如果你想在Surface上绘图,那通常是从一个单独的线程完成的。 (SurfaceView有两个部分;表面部分是一个完全独立的层,使用基于视图的UI在图层后面绘制。)
如果你还没有调用SurfaceHolder().addCallback()
,没有对象会接收回调 - SurfaceView不会向自己发送回调,所以继承SurfaceView并没有为你做太多的事。
也许你想要的只是一个custom View?