Android 为什么无效不起作用?

Android 为什么无效不起作用?,android,android-custom-view,Android,Android Custom View,我正在尝试单击一个按钮并添加一个电阻器。因此,我需要的是在单击按钮时使视图无效。但是方法更新中MyView中的invalidate不起作用。我一直在试图寻找这个问题,但我没有发现任何类似于我试图做的事情,或者可能这不是解决问题的方法 DefaultActivity.java MyView.java 您应该使用视图组而不是SurfaceView。将电阻器视图作为子视图添加到MyView中,视图组将自动绘制它们 SurfaceView要求您在单独的线程中绘制。您必须在surfaceCreated中启

我正在尝试单击一个按钮并添加一个电阻器。因此,我需要的是在单击按钮时使视图无效。但是方法更新中MyView中的invalidate不起作用。我一直在试图寻找这个问题,但我没有发现任何类似于我试图做的事情,或者可能这不是解决问题的方法

DefaultActivity.java

MyView.java

您应该使用视图组而不是SurfaceView。将电阻器视图作为子视图添加到MyView中,视图组将自动绘制它们


SurfaceView要求您在单独的线程中绘制。您必须在surfaceCreated中启动该线程,并根据需要继续重新绘制视图。对于像您发布的那样的简单视图,只在UI线程中绘制图形是完全可以接受的。不需要SurfaceView。

我以前没有使用过SurfaceView,但如果您在中可以看到,SurfaceView类没有名为invalidate的函数

也许你可以设法重新使用这一行:

holder.unlockCanvasAndPost(c);

谢谢你的回答。我将尝试使用ViewGroup来了解它是如何工作的。所以,如果我想继续使用SurfaceView,我需要创建一个单独的线程?然后我就能做我想做的事情了?基本上,是的。例如,您可以创建一个具有无限循环的线程,该循环不断地重新绘制视图。不过,这对您的CPU来说显然是个坏消息。SurfaceView用于非常特殊的绘图需求,例如浏览器或地图,需要在通过背景线程渲染瓷砖后立即重新绘制瓷砖。您通常不需要它。实际上,这里您错了,因为SurfaceView扩展了视图,而继承的方法之一是invalidate。
public class MyView extends SurfaceView implements SurfaceHolder.Callback{      


  Resistor myResistor;
  private ArrayList<Resistor> mElements = new ArrayList<Resistor>();


  public MyView(Context context, AttributeSet attrs) {
    super(context, attrs);  
    getHolder().addCallback(this);  

  } 

  @Override
  protected void onDraw(Canvas canvas) {

    super.onDraw(canvas);

    synchronized (mElements) {
        for (Resistor element : mElements) {
            element.doDraw(canvas);                
        }
    }   

  }

  public void update() {

       mElements.add(new Resistor(getContext(), (int) 10, (int) 10));
       invalidate(); //Does not work!
  }


  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {

    Canvas c = holder.lockCanvas();
    onDraw(c);      
    holder.unlockCanvasAndPost(c);      
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub  

  } 

}
public class Resistor extends View{

  private Path mSymbol;
  private Paint mPaint;

  private int mX;
  private int mY;

  //...Override Constructors...    
  public Resistor(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }

  public Resistor(Context context, int x, int y){
    super(context);
    mX = x;
    mY = y;
    init();
  }

  private void init() {
    mSymbol = new Path();
    mPaint = new Paint();

    mPaint.setAntiAlias(true);      
    mPaint.setStrokeWidth(2);
    mPaint.setColor(-7829368);
    mPaint.setStyle(Paint.Style.STROKE);

    //...Your code here to set up the path,
    //...allocate objects here, never in the drawing code.

    mSymbol.moveTo(0.0F, 0.0F);
    mSymbol.lineTo(0.0F, 50.0F);
    mSymbol.lineTo(16.666666F, 58.333332F);
    mSymbol.lineTo(-16.666666F, 75.0F);
    mSymbol.lineTo(16.666666F, 91.666664F);
    mSymbol.lineTo(-16.666666F, 108.33333F);
    mSymbol.lineTo(16.666666F, 124.99999F);
    mSymbol.lineTo(-16.666666F, 141.66666F);
    mSymbol.lineTo(0.0F, 150.0F);
    mSymbol.lineTo(0.0F, 200.0F);
    mSymbol.offset(mX, mY);

  }

  public void doDraw(Canvas canvas) {
    canvas.drawPath(mSymbol, mPaint);
  }
holder.unlockCanvasAndPost(c);