45 private static final String TAG =
"FlutterImageView";
47 @NonNull
private ImageReader imageReader;
48 @Nullable
private Image currentImage;
49 @Nullable
private Bitmap currentBitmap;
68 private boolean isAttachedToFlutterRenderer =
false;
75 this(context, createImageReader(
width,
height), kind);
90 this.imageReader = imageReader;
99 private static void logW(String
format, Object...
args) {
103 @SuppressLint(
"WrongConstant")
105 private static ImageReader createImageReader(
int width,
int height) {
107 logW(
"ImageReader width must be greater than 0, but given width=%d, set width=1",
width);
111 logW(
"ImageReader height must be greater than 0, but given height=%d, set height=1",
height);
114 if (
android.os.Build.VERSION.SDK_INT >= API_LEVELS.API_29) {
115 return ImageReader.newInstance(
118 PixelFormat.RGBA_8888,
120 HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE | HardwareBuffer.USAGE_GPU_COLOR_OUTPUT);
122 return ImageReader.newInstance(
width,
height, PixelFormat.RGBA_8888, 3);
128 return imageReader.getSurface();
134 return flutterRenderer;
145 flutterRenderer.swapSurface(imageReader.getSurface());
153 this.flutterRenderer = flutterRenderer;
154 isAttachedToFlutterRenderer =
true;
162 if (!isAttachedToFlutterRenderer) {
170 currentBitmap =
null;
175 isAttachedToFlutterRenderer =
false;
191 if (!isAttachedToFlutterRenderer) {
200 final Image newImage = imageReader.acquireLatestImage();
201 if (newImage !=
null) {
204 currentImage = newImage;
207 return newImage !=
null;
212 if (flutterRenderer ==
null) {
215 if (
width == imageReader.getWidth() &&
height == imageReader.getHeight()) {
239 super.onDraw(canvas);
240 if (currentImage !=
null) {
241 updateCurrentBitmap();
243 if (currentBitmap !=
null) {
244 canvas.drawBitmap(currentBitmap, 0, 0,
null);
248 private void closeCurrentImage() {
250 if (currentImage !=
null) {
251 currentImage.close();
256 @TargetApi(API_LEVELS.API_29)
257 private
void updateCurrentBitmap() {
258 if (
android.os.Build.VERSION.SDK_INT >= API_LEVELS.API_29) {
259 final HardwareBuffer
buffer = currentImage.getHardwareBuffer();
260 currentBitmap = Bitmap.wrapHardwareBuffer(
buffer, ColorSpace.get(ColorSpace.Named.SRGB));
263 final Plane[] imagePlanes = currentImage.getPlanes();
264 if (imagePlanes.length != 1) {
268 final Plane imagePlane = imagePlanes[0];
269 final int desiredWidth = imagePlane.getRowStride() / imagePlane.getPixelStride();
270 final int desiredHeight = currentImage.getHeight();
272 if (currentBitmap ==
null
273 || currentBitmap.getWidth() != desiredWidth
274 || currentBitmap.getHeight() != desiredHeight) {
277 desiredWidth, desiredHeight,
android.graphics.Bitmap.Config.ARGB_8888);
279 ByteBuffer
buffer = imagePlane.getBuffer();
281 currentBitmap.copyPixelsFromBuffer(
buffer);
287 if (
width == imageReader.getWidth() &&
height == imageReader.getHeight()) {
297 flutterRenderer.swapSurface(imageReader.getSurface());
static const uint8_t buffer[]
uint32_t uint32_t * format