2012-06-26 3 views
2

모든 조각을 모으는 데 문제가 있습니다. 나는 DefaultActivity을 확장하여 Activity, MyView을 확장하고 SurfaceView, 그리고 ResistorView을 확장하여 View 인 클래스를 가지고 있습니다.SurfaceView 내에서 사용자 정의 뷰를 그리는 방법은 무엇입니까?

내가 알고 싶은 것은 클래스에서 bAddResistor 버튼을 클릭 할 때마다 어떻게 저항을 그립니까? 여기서, 3 종류의 일부이다 :

DefaultActivity.java

public class DefaultActivity extends Activity { 

    //MyView myView; 
    TextView myText; 
    ResistorView myResistor; 

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

     //myView = (MyView) findViewById(R.id.my_view); 
     //myView = new MyView(this, null);  
     //myResistor = new ResistorView(this); 
     //myView.setBackgroundColor(Color.WHITE); 
     //myView.setScrollContainer(true); 
     setContentView(R.layout.main); 


     final Button bAddResistor = (Button) findViewById(R.id.bAdd); 

     bAddResistor.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
      // Perform action on click     

      Global.numberOfResistors++;     
      Log.d("ButtonADD", "Button Add has been clicked"); 
      } 
     }); 
    } 
} 

MyView.java

public class MyView extends SurfaceView implements SurfaceHolder.Callback { 
    public MyView(Context context, AttributeSet attrs) { 
     super(context, attrs);  
     getHolder().addCallback(this);  
    }   

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

    @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  
    } 
} 

ResistorView.java

public class ResistorView extends View { 
    private Path mSymbol; 
    private Paint mPaint; 

    //...Override Constructors... 
    public ResistorView(Context context) { 
     super(context); 
     init(); 
    } 

    public ResistorView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     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(100.0F, 20.0F); 
    } 

    //...Override onMeasure()... 
    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     //Use this method to tell Android how big your view is 
     setMeasuredDimension(50, 50); 
    } 

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

     canvas.drawPath(mSymbol, mPaint); 
    }   
} 

및 main.xml에 배치

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/RelativeLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    tools:ignore="HardcodedText" > 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/RightLayout" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_alignParentRight="true" 
     android:background="#00000000" 
     android:orientation="vertical" > 

     <Button 
      android:id="@+id/bAdd" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Add RES" /> 

     <Button 
      android:id="@+id/bDeleate" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Del RES" /> 

    </LinearLayout> 

    <com.defaul.android.MyView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_toLeftOf="@id/RightLayout" 
     android:background="#ff000000" /> 

</RelativeLayout> 

MyView.onDraw에 드로잉 코드를 입력하면 레지스터가 그려집니다. 내가 원하는 것은 버튼을 클릭하여 표면에 저항을 그리는 것입니다. 그래서 클릭 할 때마다 표면보기에 저항을 추가하고 싶습니다.

아마 반대 방향으로이 문제에 접근하고 있습니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면 나는 그것을 정말로 높이 평가할 것이다.

답변

2

SurfaceView으로 내가 원하는 것을 할 수있는 방법을 찾지 못했기 때문에 View를 확장 한 클래스를 만든 다음이보기를 기본 레이아웃에 추가합니다.

public class CircuitSolverActivity extends Activity { 
/** Called when the activity is first created. */ 

RelativeLayout mLayout; 
MyView mView; 


@Override  
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);   

    mLayout = (RelativeLayout)findViewById(R.id.elementContainer);     

} 

public void bAddView(View view){ 

     mView = new MyView(context);    
     mView.setBackgroundColor(Color.TRANSPARENT);    
     mLayout.addView(mView); 
} 

MyView 클래스 :

public class ResistorView extends View { 

public ResistorView(Context context, AttributeSet attrs) { 
    super(context, attrs);     
    init();   
} 

public ResistorView(Context context){ 
    super(context);   
    init(); 
} 

private void init() { 

    mSymbol = new Path(); 
    mPaint = new Paint();   

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


    mSymbol.moveTo(0.0F, 0.0F); 
    mSymbol.lineTo(0.0F, 50.0F);   

} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawPath(mSymbol, mPaint); 
} 
누군가 도움이 될 경우

은 아래에있는 내 코드의 단순화 된 버전입니다
관련 문제