Первоначально я думал, что вам может повезти, и это может быть простой случай переопределения метода onDraw(Canvas)
TextureView, чтобы сделать что-то вроде этого:
final int xTiles = 5;
final int yTiles = 5;
@Override
public void onDraw(Canvas canvas){
int widthPerTile = canvas.getWidth() / xTiles;
int heightPerTile = canvas.getHeight() / yTiles;
float widthScale = widthPerTile / (float) canvas.getWidth();
float heightScale = heightPerTile / (float) canvas.getHeight();
for(int x = 0; x < xTiles; x++){
for(int y = 0; y < yTiles; y++){
canvas.save();
canvas.translate(x * widthPerTile, y * heightPerTile);
canvas.scale(widthScale, heightScale);
super.onDraw(canvas);
canvas.restore();
}
}
}
Тогда вам понадобится только один CustomTextureView, занимающий весь экран, и он будет выглядеть много, потому что он будет рисовать себя много раз.
Однако TextureView работает иначе. Вместо этого TextureView имеет фиктивный метод onDraw(Canvas)
и вместо этого использует свой собственный метод draw(Canvas)
, который является окончательным и поэтому не может быть переопределен. TextureView использует OpenGL для отрисовки кадров с камеры, и довольно сложно внедрить себя в этот процесс, хотя кажется возможным следующие примеры, которые можно найти в обсуждаемых здесь. Это действительно сложная тема, и, вероятно, это слишком для субботнего утра, чтобы я мог написать краткий ответ.
Но мне удалось быстро собрать кое-что, чем вы могли бы воспользоваться и работать, хотя у него есть некоторые очевидные проблемы с памятью и частотой кадров:
public class CopyCatTextureView extends View {
TextureView textureViewToCopy;
public CopyCatTextureView(Context context) {
super(context);
}
public void setTextureViewToCopy(TextureView view){
this.textureViewToCopy = view;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(textureViewToCopy != null){
textureViewToCopy.draw(canvas);
}
}
}
Если у вас есть сетка из одного TextureView, а остальные — это CopyCatTextureView, вы можете вызвать setTextureViewToCopy(TextureView)
для каждого из копирующих котов, чтобы указать на одиночный TextureView, а затем просто вызвать invalidate()
для каждого из копирующих котов всякий раз, когда вы хотите обновить кадр. Очевидно, что это не идеально, но это быстро и определенно сработает, если вам нужен только один кадр.
Надеюсь это поможет. Удачи.
(переменная отредактирована)
person
DanielLaneDC
schedule
25.02.2017