2013-08-06 3 views
0

이 코드가 있습니다. 나는 새로운 클래스 "diagrama"를 정의한다. 나는 View를 확장한다.이 코드에 단추 (회 전자) 추가

화면 하단에 버튼 (특히 회 전자 버튼)을 추가하고 싶지만 어떻게해야할지 모르겠다.

저는 상태 머신을 만들기 위해 두 개의 "상태"를 누른 다음 라인을 연결하려고합니다. 각 줄에 텍스트가있는 입력 및 출력을 표시하려고합니다.

입력 및 출력을 선택하기 위해 AlertBuild를 만들려고했지만 주석을 달았습니다. 입력과 출력을 선택하기위한 두 개의 스피너 버튼을 만들고 싶습니다.

저는이 앱을 시작하지 않았지만이 앱에 문제가 없지만 계속 진행할 수 없습니다.

누군가 나를 도울 수 있으면 감사하겠습니다.

감사합니다.

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import android.graphics.Path; 
import android.graphics.RectF; 
import android.os.Bundle; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Button; 

public class MainActivity extends Activity{ 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new diagrama(this)); //creo el layout "diagrama" desde java y no desde xml 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public class diagrama extends View{ 

     //coordenadas x y en el momento en el que tocas la pantalla 
     float x=0; 
     float y=0; 
     float x_origen,y_origen,x_destino,y_destino; 

     //coordenadas de los centros de cada círculo 
     float x_S0=160, y_S0=100, 
       x_S1=260, y_S1=200, 
       x_S2=160, y_S2=200, 
       x_S3=160, y_S3=300, 
       x_S4=60, y_S4=200, 
       radio=20, 
       radio_ovalo=100; 

     int contador=0, //contador de las 2 bolas pulsadas 
       contador_lineas=0, //contador de número de flechas dibujadas 
       i=0; 

     String accion="accion"; //acción para cuando pulsas un círculo que se coloree en rojo 
     String text;  
     Path path= new Path(); //path para crear flechas  


     public diagrama (Context context) { 
      super(context); 
     } 


     //Método para dibujar 
     @Override 
     protected void onDraw(Canvas canvas){ 

      //Creamos el pincel con el que vamos a dibujar 
      Paint pincel = new Paint(); 
      pincel.setColor(Color.BLACK); 
      pincel.setStrokeWidth(2); 
      pincel.setStyle(Style.STROKE); 

      //Creamos el camino del ovalo principal 
      final RectF ovalo_principal = new RectF(); 
      ovalo_principal.set(x_S2-radio_ovalo, 
        y_S2-radio_ovalo, 
        x_S2+radio_ovalo, 
        y_S2+radio_ovalo); 

      //Creamos el camino del ovalo de la izquierda 
      final RectF ovalo_izquierda = new RectF(); 
      ovalo_izquierda.set(x_S4-((3*radio_ovalo)/2), 
        y_S4-((3*radio_ovalo)/2), 
        x_S4+((3*radio_ovalo)/2), 
        y_S4+((3*radio_ovalo)/2)); 

      //Creamos el camino del ovalo de la derecha 
      final RectF ovalo_derecha = new RectF(); 
      ovalo_derecha.set(x_S1-((3*radio_ovalo)/2), 
        y_S1-((3*radio_ovalo)/2), 
        x_S1+((3*radio_ovalo)/2), 
        y_S1+((3*radio_ovalo)/2)); 

      //Creamos el camino del ovalo superior derecha 
      final RectF ovalo_superior_derecha = new RectF(); 
      ovalo_superior_derecha.set(x_S1-radio_ovalo, 
        y_S1-100-radio_ovalo, 
        x_S1+radio_ovalo, 
        y_S1-100+radio_ovalo); 

      //Creamos el camino del ovalo superior izquierda 
      final RectF ovalo_superior_izquierda = new RectF(); 
      ovalo_superior_izquierda.set(x_S4-radio_ovalo, 
        y_S4-100-radio_ovalo, 
        x_S4+radio_ovalo, 
        y_S4-100+radio_ovalo); 

      //Creamos el camino del ovalo inferior izquierda 
      final RectF ovalo_inferior_izquierda = new RectF(); 
      ovalo_inferior_izquierda.set(x_S4-radio_ovalo, 
        y_S4+100-radio_ovalo, 
        x_S4+radio_ovalo, 
        y_S4+100+radio_ovalo); 

      //Creamos el camino del ovalo inferior derecha 
      final RectF ovalo_inferior_derecha = new RectF(); 
      ovalo_inferior_derecha.set(x_S1-radio_ovalo, 
        y_S1+100-radio_ovalo, 
        x_S1+radio_ovalo, 
        y_S1+100+radio_ovalo); 

      //Creamos el camino del ovalo pequeño superior 
      final RectF ovalo_pequeño_superior = new RectF(); 
      ovalo_pequeño_superior.set(x_S0-(radio_ovalo/2)+radio, 
        y_S0+50-(radio_ovalo/2)+radio, 
        x_S0+(radio_ovalo/2)-radio, 
        y_S0+50+(radio_ovalo/2)-radio); 

      //Creamos el camino del ovalo pequeño inferior 
      final RectF ovalo_pequeño_inferior = new RectF(); 
      ovalo_pequeño_inferior.set(x_S0-(radio_ovalo/2), 
        y_S0+150-(radio_ovalo/2), 
        x_S0+(radio_ovalo/2), 
        y_S0+150+(radio_ovalo/2)); 

      //Creamos el camino del ovalo pequeño derecha 
      final RectF ovalo_pequeño_derecha = new RectF(); 
      ovalo_pequeño_derecha.set(x_S4+150-(radio_ovalo/2), 
        y_S4-(radio_ovalo/2), 
        x_S4+150+(radio_ovalo/2), 
        y_S4+(radio_ovalo/2)); 

      //Creamos el camino del ovalo pequeño derecha 
      final RectF ovalo_pequeño_izquierda = new RectF(); 
      ovalo_pequeño_izquierda.set(x_S4+50-(radio_ovalo/2), 
        y_S4-(radio_ovalo/2), 
        x_S4+50+(radio_ovalo/2), 
        y_S4+(radio_ovalo/2)); 

      //Creamos el camino del ovalo inferior 
      final RectF ovalo_inferior = new RectF(); 
      ovalo_inferior.set(x_S3-((float) Math.sqrt((radio_ovalo*radio_ovalo)+(radio_ovalo*radio_ovalo))), 
        y_S3-((float)Math.sqrt((radio_ovalo*radio_ovalo)+(radio_ovalo*radio_ovalo))), 
        x_S3+((float)Math.sqrt((radio_ovalo*radio_ovalo)+(radio_ovalo*radio_ovalo))), 
        y_S3+((float)Math.sqrt((radio_ovalo*radio_ovalo)+(radio_ovalo*radio_ovalo)))); 

      //Creamos el camino del ovalo superior 
      final RectF ovalo_superior = new RectF(); 
      ovalo_superior.set(x_S0-((float) Math.sqrt((radio_ovalo*radio_ovalo)+(radio_ovalo*radio_ovalo))), 
        y_S0-((float)Math.sqrt((radio_ovalo*radio_ovalo)+(radio_ovalo*radio_ovalo))), 
        x_S0+((float)Math.sqrt((radio_ovalo*radio_ovalo)+(radio_ovalo*radio_ovalo))), 
        y_S0+((float)Math.sqrt((radio_ovalo*radio_ovalo)+(radio_ovalo*radio_ovalo)))); 

      //Dibujamos círculos y letras 
      canvas.drawCircle(x_S0, y_S0, radio, pincel); 
      canvas.drawText("S0",x_S0-5,y_S0+5, pincel); 

      canvas.drawCircle(x_S1, y_S1, radio, pincel); 
      canvas.drawText("S1",x_S1-5,y_S1+5, pincel); 

      canvas.drawCircle(x_S2, y_S2, radio, pincel); 
      canvas.drawText("S2",x_S2-5,y_S2+5, pincel); 

      canvas.drawCircle(x_S3, y_S3, radio, pincel); 
      canvas.drawText("S3",x_S3-5,y_S3+5, pincel); 

      canvas.drawCircle(x_S4, y_S4, radio, pincel); 
      canvas.drawText("S4",x_S4-5,y_S4+5, pincel); 

      //Si se pulsa un círculo, lo pintamos de rojo como si estuviera seleccionado 
      if (accion=="S0"){ 

       pincel.setColor(Color.RED); 
       canvas.drawText("S0",x_S0-5,y_S0+5, pincel); 
       pincel.setColor(Color.BLACK); 
      } 

      if (accion=="S1"){ 

       pincel.setColor(Color.RED); 
       canvas.drawText("S1",x_S1-5,y_S1+5, pincel); 
       pincel.setColor(Color.BLACK); 
      } 

      if (accion=="S2"){ 

       pincel.setColor(Color.RED); 
       canvas.drawText("S2",x_S2-5,y_S2+5, pincel); 
       pincel.setColor(Color.BLACK); 
      } 

      if (accion=="S3"){ 

       pincel.setColor(Color.RED); 
       canvas.drawText("S3",x_S3-5,y_S3+5, pincel); 
       pincel.setColor(Color.BLACK); 
      } 

      if (accion=="S4"){ 

       pincel.setColor(Color.RED); 
       canvas.drawText("S4",x_S4-5,y_S4+5, pincel); 
       pincel.setColor(Color.BLACK); 
      } 


      //Para el segundo círculo pulsado 
      if (contador==2){ 



       //    //Mostramos el diálogo de alerta 
       //    final CharSequence[] items = {"0/0", "0/1", "1/0", "1/1"}; 
       //    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 
       //    builder.setTitle("Indica combinación de entrada/salida"); 
       //  
       //    builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() { 
       //     public void onClick(DialogInterface dialog, int item) { 
       //      
       //      if (item==1){ 
       //       text="0/0"; 
       //       dialog.cancel(); 
       //      } 
       // 
       //      if (item==2){ 
       //       text="0/1"; 
       //       dialog.cancel(); 
       //      } 
       // 
       //      if (item==3){ 
       //       text="1/0"; 
       //       dialog.cancel(); 
       //      } 
       // 
       //      if (item==4){ 
       //       text="1/1"; 
       //       dialog.cancel(); 
       //      } 
       //     } 
       // 
       //    }); 
       //    
       //    AlertDialog alert = builder.create(); 
       //    alert.show(); 


       //Vemos cuál es el segundo círculo pulsado 
       if ((x>=x_S0-radio && x<=x_S0+radio) && (y>=y_S0-radio && y<=y_S0+radio)){ //S0 

        x_destino=x_S0; //guardamos las coordenadas del segundo círculo pulsado como destino 
        y_destino=y_S0; 


        if (x_origen==260 && y_origen==200){ //S1 

         path.arcTo(ovalo_principal,-12,-66 ,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==60 && y_origen==200){ //S4 

         path.arcTo(ovalo_principal,192,66 ,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==160 && y_origen==200){//S2 

         path.arcTo(ovalo_pequeño_superior,80,-160 ,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==160 && y_origen==300){//S3 

         path.arcTo(ovalo_izquierda,38,-76 ,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 
        //     } 
        contador=0; 


       } 

       if ((x>=x_S1-radio && x<=x_S1+radio) && (y>=y_S1-radio && y<=y_S1+radio)){//S1 


        x_destino=x_S1; 
        y_destino=y_S1; 


        if (x_origen==160 && y_origen==100){ //S0 

         path.arcTo(ovalo_superior_derecha,102,66,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==60 && y_origen==200){ //S4 

         path.arcTo(ovalo_superior,127,-74,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==160 && y_origen==200){//S2 

         path.arcTo(ovalo_pequeño_derecha,12,166 ,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==160 && y_origen==300){//S3 

         path.arcTo(ovalo_principal,12,66 ,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 
        //     } 
        contador=0; 
       } 

       if ((x>=x_S2-radio && x<=x_S2+radio) && (y>=y_S2-radio && y<=y_S2+radio)){//S2 


        x_destino=x_S2; 
        y_destino=y_S2; 


        if (x_origen==160 && y_origen==100){ //S0 

         path.arcTo(ovalo_pequeño_superior,102,156,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==60 && y_origen==200){ //S4 

         path.arcTo(ovalo_pequeño_izquierda,12,166,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==260 && y_origen==200){//S1 

         path.arcTo(ovalo_pequeño_derecha,-12,-166,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==160 && y_origen==300){//S3 

         path.arcTo(ovalo_pequeño_inferior,102,156,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        //     } 
        contador=0; 
       } 

       if ((x>=x_S3-radio && x<=x_S3+radio) && (y>=y_S3-radio && y<=y_S3+radio)){//S3 


        x_destino=x_S3; 
        y_destino=y_S3; 

        if (x_origen==160 && y_origen==100){ //S0 

         path.arcTo(ovalo_derecha,142,76,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==60 && y_origen==200){ //S4 

         path.arcTo(ovalo_principal,102,76,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==260 && y_origen==200){//S1 

         path.arcTo(ovalo_inferior_derecha,192,66,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==160 && y_origen==200){//S2 

         path.arcTo(ovalo_pequeño_inferior,78,-156,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 
        //     } 
        contador=0; 
       } 


       if ((x>=x_S4-radio && x<=x_S4+radio) && (y>=y_S4-radio && y<=y_S4+radio)){//S4 


        x_destino=x_S4; 
        y_destino=y_S4; 


        if (x_origen==160 && y_origen==100){ //S0 

         path.arcTo(ovalo_superior_izquierda,12,66,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==160 && y_origen==300){ //S3 

         path.arcTo(ovalo_inferior_izquierda,-12,-66,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==260 && y_origen==200){//S1 

         path.arcTo(ovalo_inferior,233,74,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        if (x_origen==160 && y_origen==200){//S2 

         path.arcTo(ovalo_pequeño_izquierda,192,156,true); 
         canvas.drawPath(path, pincel); 
         //       canvas.drawTextOnPath(text, path, 50, 20, pincel); 
        } 

        //     } 
        contador=0; 
       } 
      } 

     } 

     //Método que escucha si pulsamos la pantalla 

     public boolean onTouchEvent(MotionEvent e){ 

      //Obtenemos coordenadas de donde pulsamos 
      x=e.getX(); 
      y=e.getY(); 

      //Si pulsamos cualquiera de los círculos 

      if ((x>=x_S0-radio && x<=x_S0+radio) && (y>=y_S0-radio && y<=y_S0+radio)){ //S0 

       if (e.getAction()==MotionEvent.ACTION_DOWN){ 
        accion="S0"; //señal para colorear de rojo el circulo 
       } 

       if (e.getAction()==MotionEvent.ACTION_UP){ 
        contador=contador+1; //contador de que hemos pulsado el primer círculo 
        if (contador==1){ //si pulsamos el primer círculo, guardamos las coordenadas de ese círculo como origen 
         x_origen=x_S0; 
         y_origen=y_S0; 
        } 
       } 
      } 

      if ((x>=x_S1-radio && x<=x_S1+radio) && (y>=y_S1-radio && y<=y_S1+radio)){//S1 

       if (e.getAction()==MotionEvent.ACTION_DOWN){ 
        accion="S1"; 
       } 

       if (e.getAction()==MotionEvent.ACTION_UP){ 
        contador=contador+1; 
        if (contador==1){ 
         x_origen=x_S1; 
         y_origen=y_S1; 
        } 
       } 
      } 

      if ((x>=x_S2-radio && x<=x_S2+radio) && (y>=y_S2-radio && y<=y_S2+radio)){//S2 

       if (e.getAction()==MotionEvent.ACTION_DOWN){ 
        accion="S2"; 
       } 

       if (e.getAction()==MotionEvent.ACTION_UP){ 
        contador=contador+1; 
        if (contador==1){ 
         x_origen=x_S2; 
         y_origen=y_S2; 
        } 
       } 
      } 

      if ((x>=x_S3-radio && x<=x_S3+radio) && (y>=y_S3-radio && y<=y_S3+radio)){//S3 

       if (e.getAction()==MotionEvent.ACTION_DOWN){ 
        accion="S3"; 
       } 

       if (e.getAction()==MotionEvent.ACTION_UP){ 
        contador=contador+1; 
        if (contador==1){ 
         x_origen=x_S3; 
         y_origen=y_S3; 
        } 
       } 
      } 

      if ((x>=x_S4-radio && x<=x_S4+radio) && (y>=y_S4-radio && y<=y_S4+radio)){//S4 

       if (e.getAction()==MotionEvent.ACTION_DOWN){ 
        accion="S4"; 
       } 

       if (e.getAction()==MotionEvent.ACTION_UP){ 
        contador=contador+1; 
        if (contador==1){ 
         x_origen=x_S4; 
         y_origen=y_S4; 
        } 
       } 
      } 

      invalidate(); 

      return true; 

     } 

    } 

} 
+0

은 어디에서이 코드를 얻었 는가하면 회로 굉장한 감사? –

+1

먼저보기에 다른 그룹을 포함 시키려면 View를 확장하고 ViewGroup을 확장하지 마십시오. –

+0

아니면 레이아웃 파일을 사용하고 다이어그램을 레이아웃의 한 요소로 사용하십시오. (아마 더 나은 접근법) –

답변

0

보기를 확장하지 마십시오. 전체 레이아웃을 원하는대로 설정 한 다음 추가해야하는 부분을 꺼내서 "레이아웃"폴더의 새 XML에 넣습니다.

RelativeLayout parent= (RelativeLayout)findViewById(R.id.item); 
View element = getLayoutInflater().inflate(R.layout.element, parent); 

RelativeLayout을 가지고있는 레이아웃의 종류로 변경하고 ID를 변경해야합니다.

+0

스피너 버튼이 추가 된 코드를 완성 해 주시면 감사하겠습니다. 고마워요 – user2558672

+0

어, 그건 코드입니다. 회 전자를 "레이아웃"폴더의 xml 파일에 복사하여 붙여 넣기하고이 코드를 실행하십시오. –

0

내가 만들었으며, 나는에서 onCreate

내부 I가 가지고 다음
RelativeLayout parent= (RelativeLayout)findViewById(R.id.spinner1); 

와,이 스피너 중 하나 finded 한 후 XML은 두 스피너

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

    <Spinner 
     android:id="@+id/spinner2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" /> 

    <Spinner 
     android:id="@+id/spinner1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" /> 

</RelativeLayout> 

로 ("activity_main"라고 함) 이 코드를 작성 하시겠습니까?

getLayoutInflater().inflate(R.layout.activity_main, parent);