Dibuje un android.media.Image a una superficie
Tengo esta aplicación de Android.
Utiliza un SurfaceView
, desde donde obtengo la Surface
través de SurfaceHolder
.
- Caché ExoPlayer
- Cómo usar android exoplayer
- Exoplayer: ¿Cómo reproducir audio a través de auriculares?
- Cómo utilizar ExoPlayer
- MPEG-TS H.264 con ExoPlayer
También utiliza ExoPlayer
para transmitir videos. Sin embargo, he instanciado un ImageReader
, obtener su Surface
y pasar a la ExoPlayer
.
Ahora, estoy en el ImageReader.OnImageAvailableListener#onImageAvailable
y ImageReader.OnImageAvailableListener#onImageAvailable
a la última Image
.
Quiero manipular la Image
y enviar los nuevos datos a la Surface
" SurfaceView
".
¿Cómo puedo "dibujar" un android.media.Image
a un android.view.Surface
?
- Android - Visualización de ExoPlayer en un círculo
- Caché persistente de MediaPlayer de Android con ExoPlayer
- Obtención de pantalla en negro cuando se agrega ExoPlayer a GLSurfaceView
- Textureview obtener Superficie
- Android - Exoplayer 2 - reproduce múltiples sonidos / audio simultáneamente - MergingMediaSource
- Exoplayer lanza excepción de inicialización de decodificador para archivos mp4 grandes en android
- Android - ExoPlayer2 subtítulos
- ExoPlayer no reproduce audio en los dispositivos que utilizan FFMPEG
Posible duplicado de: cómo dibujar la imagen en el androide de vista superficial
Primero obtenga su lienzo usando lockCanvas()
(vea aquí ), obtenga su imagen y haga que sea un dibujable usando:
my_bitmap = Bitmap.createBitmap( MediaStore.Images.Media.getBitmap(getContentResolver(), uri), 0,0,90, 90); drawable=new BitmapDrawable(my_bitmap);
Después de eso, puede dibujar el dibujable en el lienzo bloqueado y utilizar unlockCanvasAndPost (Canvas canvas)
para publicar el lienzo actualizado de nuevo a la vista de superficie.
Aquí está la respuesta para su pregunta.
MainActivity.java
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mySurfaceView mySurfaceView = new mySurfaceView(getApplicationContext()); setContentView(mySurfaceView); } }
MySurfaceView.java
public class mySurfaceView extends SurfaceView implements SurfaceHolder.Callback { private TutorialThread _thread; public mySurfaceView(Context context) { super(context); getHolder().addCallback(this); _thread = new TutorialThread(getHolder(), this); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Bitmap _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.icon); canvas.drawColor(Color.BLACK); canvas.drawBitmap(_scratch, 10, 10, null); } public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } public void surfaceCreated(SurfaceHolder arg0) { _thread.setRunning(true); _thread.start(); } public void surfaceDestroyed(SurfaceHolder arg0) { boolean retry = true; _thread.setRunning(false); while (retry) { try { _thread.join(); retry = false; } catch (InterruptedException e) { } } } class TutorialThread extends Thread { private SurfaceHolder _surfaceHolder; private mySurfaceView _panel; private boolean _run = false; public TutorialThread(SurfaceHolder surfaceHolder, mySurfaceView panel) { _surfaceHolder = surfaceHolder; _panel = panel; } public void setRunning(boolean run) { _run = run; } @Override public void run() { Canvas c; while (_run) { c = null; try { c = _surfaceHolder.lockCanvas(null); synchronized (_surfaceHolder) { _panel.onDraw(c); } } finally { if (c != null) { _surfaceHolder.unlockCanvasAndPost(c); } } } } } }
- Utilizar IExtendedNetworkService para obtener respuesta de USSD en Android
- ¿Hay alguna manera de hacer que una vista web que ejecuta android 4.0 se realice a un nivel aceptable?