Cómo crear una actividad sin 'setContentView (R.layout.main)'
Sé que es posible crear actividades haciendo algo como el código abajo, donde la vista no se establece desde el archivo xml, sino así: setContentView (new myView (this));
Lo que no entiendo es cómo usar este código, pero todavía tienen la posibilidad de personalizarlo, por ejemplo, si quería añadir un botón al código de abajo, ¿cómo lo hago, porque no puedo simplemente añadir uno a un xml Diseño puede yo?
- RemoteViews setLayoutParams?
- ¿Es posible colocar una vista sobre otra en android?
- Cómo agregar el encabezado a la vista de lista En Android
- Guardar agregados mediante programación Vistas sobre el cambio de orientación?
- Adición de vistas a un grupo de vistas de Android mediante programación
¡ALGUNAS BUENAS RESPUESTAS A ESTO MUCHAS AGRADECIDAS 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 posicionar el botón y la vista de la imagen? (Idealmente usando el diseño relativo) La imagen de abajo muestra lo que quiero decir: (Ignora que la imagen se vuelve a clasificar según el tamaño)
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); } } } }
- Android: ¿Cómo obtener la altura y el ancho de una vista personalizada?
- Llamar al diálogo de Android sin que desaparezca el fondo
- Cual es la diferencia entre getTop y getY
- Clone textview para anexarlo a un ViewGroup
- Hacer un clic de vista en primer plano
- Android - ¿cuándo se llama a performTraversals?
- Método para permitir que una sola vista secundaria desborde los límites del grupo de vista?
- Crear una vista compuesta en Android
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ámicamente construido con un botón y su 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); } }
Entienda que sólo puede agregar vistas secundarias a su vista raíz si pasa setContentView () a ViewGroup; Como RelativeLayout, LinearLayout, etc. En otras palabras, no se 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 nomenclatura sugiere que cada palabra en un nombre de clase debe tener la primera letra en mayúscula. Así que myView
debe ser MyView
, como mínimo, hace que su código sea más fácil de leer para otros programadores y el compilador resaltará sus variables de clase con el color correcto.
- Cómo interceptar eventos de contacto desde ViewPager.OnPageChangeListener
- Cómo obtener la posición de un elemento de un PopupMenu en un ListView personalizado