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.
- Teclado personalizado sombra clave de teclado eliminar
- VideoView y Progressive descargar
- ¿Cómo obtener 720p Android Camera Preview Data?
- Android: cómo mostrar la vista previa de la cámara con devolución de llamada?
- 60 / 120fps vista previa de datos en un dispositivo Android?
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:
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
- Android - Cómo recortar la previsualización de la cámara con TextureView
- SurfaceView con vista previa de cámara no se destruye
- ¿Existe una manera de obtener una vista previa de un fragmento que se utiliza en otra vista en IntelliJ IDEA 12?
- Cómo hacer la aplicación WhiteList en modo Doze Android 6.0
- Cámara - cambios de vista previa después de iniciar la grabación de vídeo
- Android Camera 2, cómo recortar tamaño de vista previa
- Android: Acceso a los datos del marco de vista previa de cámara de hardware sin dibujarlos
- Ver la vista previa del cajón de navegación
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).
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.