Animación superpuesta a una actividad de la cámara

Estoy tratando de implementar una línea de escáner como la animación (arriba hacia abajo), en una actividad de vista previa de la cámara en una aplicación de ejercicio de Android que estoy codificando.

He hecho con éxito el código de la animación para trabajar en una sola actividad – sin la cámara preview. No importa cómo he intentado todo lo que he leído aquí en stackoverflow o buscar en la red, siempre tengo la vista previa de la cámara, pero no la superposición de animación.

Aquí está mi archivo xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:background="@android:color/transparent" android:layout_centerInParent="true"> <SurfaceView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/imageView" android:src="@drawable/scanline" android:contentDescription="@string/scanline" android:layout_gravity="left|center_vertical" android:layout_alignParentStart="true" android:layout_alignParentEnd="true" android:background="@android:color/transparent" android:baselineAlignBottom="false"/> <com.app.arsinoe.ui.widget.CameraPreview android:id="@+id/camera_preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@android:color/transparent" /> <Button android:layout_width="156dp" android:layout_height="27dp" android:text="@string/exit_button" android:id="@+id/aboardButton2" android:layout_gravity="bottom|left" android:clickable="true" android:background="#4e0612" android:textColor="@android:color/white" android:textStyle="bold" android:alpha="1" android:paddingEnd="@dimen/activity_horizontal_margin" android:paddingStart="@dimen/activity_vertical_margin" android:onClick="exitButton"/> <Button android:layout_width="310dp" android:layout_height="27dp" android:text="@string/scan_button" android:id="@+id/scanButton" android:layout_gravity="bottom|right" android:clickable="true" android:textColor="@android:color/white" android:textStyle="bold" android:alpha="1" android:background="#1b4a6c" android:paddingEnd="@dimen/activity_horizontal_margin" android:paddingStart="@dimen/activity_vertical_margin" android:onClick="scanButton"/> </FrameLayout> 

Aquí está mi código de trabajo para la animación de la línea del explorador Actividad:

 public class ScanActivity extends Activity{ private View view; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.scan_activity); final Context readySnanner = this; Handler mHandler = new Handler(); Runnable makeToast = new Runnable() { public void run() { Toast.makeText(readySnanner, "Bla bla bla...", Toast.LENGTH_LONG).show(); } }; mHandler.postDelayed(makeToast, 4000); Toast.makeText(ScanActivity.this,"Bla bla... Please wait", Toast.LENGTH_SHORT).show(); ImageView animatedImage = (ImageView) findViewById(R.id.imageView); Animation animation = AnimationUtils.loadAnimation(this, R.anim.topdown); if (animation != null) { animatedImage.startAnimation(animation);} final int SPLASH_TIME;// 4 seconds SPLASH_TIME = 4 * 1000; boolean b; b = new Handler().postDelayed(new Runnable() { @Override public void run() { } }, SPLASH_TIME); } public void exitButton(View view) { this.finish(); System.exit(0); } public void scanButton(View view) { Intent intent = new Intent(ScanActivity.this, B.class); startActivity(intent); ScanActivity.this.finish(); } 

Aquí está mi código de trabajo para CameraActivity:

 public class CameraActivity extends Activity { private Camera camera; private View view; SurfaceView animatedImage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.scan_activity); setResult(RESULT_CANCELED); // Camera may be in use by another activity or the system or not available at all try { camera = getCameraInstance(); } catch (Exception e) { e.printStackTrace(); } if(cameraAvailable(camera)){ initCameraPreview(); } else { finish(); } } // Show the camera view on the activity private void initCameraPreview() { CameraPreview cameraPreview = (CameraPreview) findViewById(R.id.camera_preview); cameraPreview.init(camera);} 

No sé cómo hacer que estas dos actividades se ejecuten juntas como una sola actividad, utilizando el archivo xml proporcionado. Por favor, ayudar a un novato, porque estoy atascado en estos tema durante 5 días!

Lo siento por no proporcionar una imagen para describir lo que estoy tratando de código, pero mi reputación es mínima. Se agradecería cualquier respuesta, preferiblemente con una muestra de trabajo.

EDITAR

La siguiente imagen muestra el diseño de la actividad: Introduzca aquí la descripción de la imagen

La línea roja debe moverse hacia arriba y hacia abajo en la animación, ovelay la vista previa de la cámara. Esto está codificado y funciona en un ImageView, pero no funciona con CameraPreview.

Esta es mi actividad CameraPreview, editada como Juan-devtopia.coop sugirió:

 public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private Context context; private Camera camera; public CameraPreview(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CameraPreview(Context context, AttributeSet attrs) { super(context, attrs); } public CameraPreview(Context context, Camera camera) { super(context); this.context = context; this.camera = camera; } public void init(Camera camera) { this.camera = camera; initSurfaceHolder(); } @SuppressWarnings("deprecation") // needed for < 3.0 private void initSurfaceHolder() { SurfaceHolder holder = getHolder(); if (holder != null) { holder.addCallback(this); } if (holder != null) { holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } } @Override public void surfaceCreated(SurfaceHolder holder) { initCamera(holder); } private void initCamera(SurfaceHolder holder) { try { camera.setPreviewDisplay(holder); camera.startPreview(); } catch (Exception ignored) { } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } public void setContext(Context context) { this.context = context; } public class Animation extends Activity { ImageView animatedImage = (ImageView) findViewById(R.id.imageView); android.view.animation.Animation animation; { animatedImage.startAnimation(animation); animation = AnimationUtils.loadAnimation(this, R.anim.topdown); } } 

Después de la compilación y ejecutar en el dispositivo, en logcat obtengo una "java.lang.RuntimeException: Incapaz de instanciar la actividad", causada por "Causado por: java.lang.InstantiationException: com.app.myapp.ui.widget.CameraPreview. Sugerencias

Coloque el ImageView en el mismo diseño que la vista previa, para que se muestre en la parte superior de la misma. A continuación, tiene ambos códigos en la misma actividad, aquella en la que se inicializa la vista previa de la cámara y la que se anima el ImageView

Trate CameraPreview como otra View desde su diseño.

En otras palabras, inicializar la vista previa de la cámara, como en el código, pero también iniciar la animación allí, dejando su método de cámara init como este:

  // Show the camera view on the activity and show overlay animation private void initCameraPreview() { CameraPreview cameraPreview = (CameraPreview) findViewById(R.id.view); cameraPreview.init(camera); ImageView animatedImage = (ImageView) findViewById(R.id.imageView); Animation animation = AnimationUtils.loadAnimation(this, R.anim.rotate); animatedImage.startAnimation(animation); } 

Tenga en cuenta que he cambiado los id's y animaciones ya que tuve que recrear esto para probarlo. El diseño simplemente contiene la superficie y la vista de la imagen, colocando la imagen más abajo en el código (lo que significa que se representará sobre la vista de la superficie). Introduzca aquí la descripción de la imagen

En mi muestra de código (he subido a gitHub para ti aquí ) el ic_launcher simplemente gira sobre la vista previa de la cámara, pero supongo que usar su animación y asegurarse de que los bucles y no sólo anima una vez, debería funcionar.

  • Grabación de vídeo de un servicio
  • Android: la vista previa de la cámara es lateral
  • Android, cuadros de vista previa de la cámara
  • Convertir el marco de vista previa en un mapa de bits
  • Tesseract de OCR para Android: uso de datos de objetos Pixa para mostrar cuadros delimitadores
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.