2012-06-21 16 views
7

Sé que es posible crear actividades por hacer algo como el código de abajo, donde la vista no se establece desde un archivo XML, pero como esto: setContentView (nuevos myView (esto));Cómo crear una actividad sin 'setContentView (R.layout.main)'

Lo que no entiendo es cómo usar este código pero todavía tengo la capacidad de personalizarlo, por ejemplo, si quería agregar un botón al código de abajo, ¿cómo lo haría, porque simplemente no puedo agregar uno a un diseño xml ¿puedo?

CUALQUIER BUENA RESPUESTA A ESTO SE APRECIARÁ MUY MUCHO gracias de antemano!

package com.faceapp; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PointF; 
import android.media.FaceDetector; 
import android.media.FaceDetector.Face; 
import android.os.Bundle; 
import android.view.View; 

public class FaceappActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.main); 
     setContentView(new myView(this)); 
    } 

    private class myView extends View{ 

    private int imageWidth, imageHeight; 
    private int numberOfFace = 5; 
    private FaceDetector myFaceDetect; 
    private FaceDetector.Face[] myFace; 
    float myEyesDistance; 
    int numberOfFaceDetected; 

    Bitmap myBitmap; 


    public myView(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 

    BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); 
    BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; 
    myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face5, 
     BitmapFactoryOptionsbfo); 
    imageWidth = myBitmap.getWidth(); 
    imageHeight = myBitmap.getHeight(); 
    myFace = new FaceDetector.Face[numberOfFace]; 
    myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); 
    numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
    // TODO Auto-generated method stub 

      canvas.drawBitmap(myBitmap, 0, 0, null); 

      Paint myPaint = new Paint(); 
      myPaint.setColor(Color.GREEN); 
      myPaint.setStyle(Paint.Style.STROKE); 
      myPaint.setStrokeWidth(3); 

      for(int i=0; i < numberOfFaceDetected; i++) 
      { 
      Face face = myFace[i]; 
      PointF myMidPoint = new PointF(); 
      face.getMidPoint(myMidPoint); 
    myEyesDistance = face.eyesDistance(); 
      canvas.drawRect(
       (int)(myMidPoint.x - myEyesDistance), 
       (int)(myMidPoint.y - myEyesDistance), 
       (int)(myMidPoint.x + myEyesDistance), 
       (int)(myMidPoint.y + myEyesDistance), 
       myPaint); 
      } 
    } 
    } 
} 

^^^^^^^^^^^^^^^ Respondido

Cómo colocar el botón y imageview? (Lo ideal sería que el uso de la disposición relativa) La foto de abajo muestra lo que quiero decir: (ignorar que la imagen está redimensionada)

enter image description here NUEVO CÓDIGO:

package com.test; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PointF; 
import android.media.FaceDetector; 
import android.media.FaceDetector.Face; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.LinearLayout; 

public class TesttActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     LinearLayout layout = new LinearLayout(this); 
     Button button = new Button(this); 
     button.setText("Button!"); 
     layout.addView(button); 

     myView custom = new myView(this); 
     layout.addView(custom); 

     setContentView(layout); 
    } 

    private class myView extends View{ 

     private int imageWidth, imageHeight; 
     private int numberOfFace = 5; 
     private FaceDetector myFaceDetect; 
     private FaceDetector.Face[] myFace; 
     float myEyesDistance; 
     int numberOfFaceDetected; 

     Bitmap myBitmap; 


     public myView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 

     BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); 
     BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565; 
     myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.face5, 
     BitmapFactoryOptionsbfo); 
     imageWidth = myBitmap.getWidth(); 
     imageHeight = myBitmap.getHeight(); 
     myFace = new FaceDetector.Face[numberOfFace]; 
     myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); 
     numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 

       canvas.drawBitmap(myBitmap, 0, 0, null); 

       Paint myPaint = new Paint(); 
       myPaint.setColor(Color.GREEN); 
       myPaint.setStyle(Paint.Style.STROKE); 
       myPaint.setStrokeWidth(3); 

       for(int i=0; i < numberOfFaceDetected; i++) 
       { 
       Face face = myFace[i]; 
       PointF myMidPoint = new PointF(); 
       face.getMidPoint(myMidPoint); 
     myEyesDistance = face.eyesDistance(); 
       canvas.drawRect(
        (int)(myMidPoint.x - myEyesDistance), 
        (int)(myMidPoint.y - myEyesDistance), 
        (int)(myMidPoint.x + myEyesDistance), 
        (int)(myMidPoint.y + myEyesDistance), 
        myPaint); 
       } 
    } 
     } 
    } 

Respuesta

14

Puede pasar setContentView() cualquier forma de vista, para ser la vista raíz de su diseño. A continuación se muestra un LinearLayout dinámica construida con un botón para que el myView.

public class Example extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     LinearLayout layout = new LinearLayout(this); 
     // Define the LinearLayout's characteristics 
     layout.setGravity(Gravity.CENTER); 
     layout.setOrientation(LinearLayout.VERTICAL); 

     // Set generic layout parameters 
     LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 

     Button button = new Button(this); 
     button.setText("Button!"); 
     layout.addView(button, params); // Modify this 

     myView custom = new myView(this); 
     layout.addView(custom, params); // Of course, this too 

     setContentView(layout); 
    } 
} 

Comprenda que solo puede agregar vistas secundarias a su vista raíz si pasa setContentView() a ViewGroup; como RelativeLayout, LinearLayout, etc. En otras palabras, usted no puede hacer esto:

 myView custom = new myView(this); 

     Button button = new Button(this); 
     button.setText("Button!"); 

     custom.addView(button); 
     // Nope! Method "addView()" does not exist for a regular View... 

     setContentView(custom); 

Además, la convención de nombres sugiere que cada palabra en un nombre de clase debe tener la primera letra en mayúscula. Así myView debe ser MyView, como mínimo que hace que su código sea más fácil de leer para otros programadores y el compilador pondrá de relieve sus variables de clase con el color correcto.

+0

Gracias mucho Sam, tengo trabajo. Mi único problema ahora es posicionar los elementos, como el botón y el imageView creado por myView/onDraw. Actualizaré la pregunta para mostrarte lo que quiero decir. :) – user1472757

+0

Im adivinar lo puede hacer por diseño RelativeLayout = new RelativeLayout (this); Pero ¿cómo puedo colocar el botón y imageview ?, Gracias – user1472757

+0

@ user1472757 I actualizado el código en mi respuesta. Cada atributo se puede establecer en XML o Java, en la Guía del desarrollador los atributos XML tienen un "método relacionado" que es una función Java (es decir, para LinearLayout 'android: orientation' es' setOrientation() '). – Sam

Cuestiones relacionadas