Можно ли пересадить класс TextureView на Android Honeycomb

Я планирую реализовать функцию воспроизведения нескольких видео на одном экране одновременно, а просмотры видео можно будет прокручивать во время воспроизведения видео.

Я собираюсь добавить просмотры видео в ListView, который действует как их родительский вид. Мы не должны использовать SurfaceView для рендеринга видеопотока, потому что SurfaceView не может быть перерисован иерархией представлений Android. Прокручивать SurfaceView — плохая идея.

К счастью, TextureView был добавлен с уровня API 14, он был заменой SurfaceView. Так что я могу использовать его для достижения моего плана.

Но TextureView доступен только выше уровня API 14. Фактически от меня потребовали реализовать эту функцию на платформе не ниже уровня API 11.

Я начинаю обращать внимание на SurfaceTexture, который был добавлен в Android с уровня API 11. Мы можем использовать SurfaceTexture, чтобы либо поместить поток изображения камеры, либо поток декодированного видео в текстуру OpenGL, я также знаю, что иерархия представлений Android рисуется opengl вместо скиа с 11 уровня API.

Поэтому мне интересно, могу ли я отобразить видеопоток на обычном представлении Android с помощью SurfaceTexture.

Другими словами, можем ли мы реализовать настраиваемый виджет для уровня API 11-13, чтобы заменить позицию TextureView, добавленную с уровня API 14?

Я просмотрел исходный код android.view.TextureView, это не очень сложно, классы зависимости следующие:

package android.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.SurfaceTexture;
import android.os.Looper;
import android.util.AttributeSet;
import android.util.Log;

И есть 4 нативных API:

private native void nCreateNativeWindow(SurfaceTexture surface);
private native void nDestroyNativeWindow();

private static native boolean nLockCanvas(int nativeWindow, Canvas canvas, Rect dirty);
private static native void nUnlockCanvasAndPost(int nativeWindow, Canvas canvas);

Можно ли пересадить класс TextureView на Android API уровня 11-13?

Кто может дать мне несколько советов?


person dragonfly    schedule 02.07.2015    source источник
comment
@AlexCohn Пожалуйста, посмотрите.   -  person dragonfly    schedule 03.07.2015
comment
@fadden Привет, пожалуйста, посмотри.   -  person dragonfly    schedule 06.07.2015


Ответы (2)


Я не могу дать вам окончательный ответ, но я сомневаюсь, что вы можете просто добавить его в свое приложение. Это может быть возможно с рефлексивным доступом к частным API.

Я не понимаю, как это может быть стоящим. Если вы посмотрите на панель управления версиями, вы увидите, что Gingerbread и более ранние версии учитывают около 5,9% активных устройств (по состоянию на 7 июля 2015 г.), поэтому, даже если вы заставите его работать с API 10, вы увеличите свою долю рынка только на несколько процентов. Функции просмотра с аппаратным ускорением были представлены в API 11, поэтому я ожидаю, что заставить TextureView работать в API 10 будет еще сложнее. API 11 даже не отображается на приборной панели — насколько я знаю, те несколько устройств, которые получили Honeycomb, имели право на обновление до ICS.

(Какие конкретные устройства вы надеетесь поддерживать с API 11, а какие с API 14? Просто существует не так много не обновленных Motorola Xoom. У вас есть устройство с API 11 для тестирования?)

Еще больше усложняет ситуацию отсутствие исходного кода API 11. Исходники Honeycomb никогда не публиковались. Так что вам придется много возиться в темноте, пытаясь заставить его работать.

Я думаю, что ваш лучший вариант - дать отпор тому, кто делает запрос.

person fadden    schedule 07.07.2015
comment
Мое устройство Samsung Galaxy Tab 7.7 (GT-P6800) - person dragonfly; 08.07.2015
comment
Постараюсь уговорить партнеров отказаться от сот, Спасибо! - person dragonfly; 08.07.2015
comment
droidviews.com/ - person fadden; 08.07.2015

Вы должны попробовать SurfaceView, это может решить вашу проблему.

Если вы не можете справиться с этим, отредактируйте свой вопрос с помощью исходного кода.

person Kaloglu    schedule 03.07.2015
comment
SurfaceView будет поврежден, когда мы прокрутим его, потому что SurfaceView не находится в иерархии представлений. - person dragonfly; 03.07.2015