0

ボタンをクリックして抵抗を追加しようとしています。したがって、必要なのは、ボタンがクリックされたときにビューを無効にすることです。MyViewただし、メソッド内にある無効化は機能しupdate()ていません。私はこの問題を探していましたが、私がやろうとしていることに似たものは何も見つかりませんでした。あるいは、これがそれを行う方法ではないかもしれません。

DefaultActivity.java

public class DefaulActivity extends Activity {       

  MyView myView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);         

    setContentView(R.layout.main);
    myView = new MyView(this, null); 

    final Button bAddResistor = (Button) findViewById(R.id.bAdd);
    bAddResistor.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            // Perform action on click              
            myView.update();                            
            Log.d("ButtonADD", "Button Add has been clicked");
        }
    });          
  } 
}

MyView.java

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  

  } 

}

Resistor.java

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);
  }
4

2 に答える 2

0

ViewGroupの代わりにを使用する必要がありSurfaceViewます。Resistor-Viewsを子として追加し、適切MyView測定およびレイアウトすると、ViewGroup自動的に描画されます。

SurfaceView別のスレッドで描画を行う必要があります。そのスレッドを開始しsurfaceCreated、必要に応じてビューを再描画し続ける必要があります。投稿したような単純なビューの場合は、UIスレッドで描画するだけで十分です。必要ありませんSurfaceView

于 2012-06-27T16:15:53.000 に答える
0

これまでSurfaceviewsを使用したことはありませんが、APIを見ると、SurfaceViewクラスに「invalidate()」という関数がないことがわかります。

たぶん、あなたはどうにかしてこの行を再利用することができます:

holder.unlockCanvasAndPost(c);
于 2012-06-27T16:22:15.120 に答える