0

TextureView에서 드로잉 프로세스를 다른 TextureView로 복제하려고합니다. 주요 목표는 TextureView에 연결된 MediaPlayer의 한 인스턴스에서 재생되는 동일한 비디오의 "벽"을 만들 수 있다는 것입니다 (나는 그 부분을 완성했습니다). 여러 MediaPlayer 인스턴스를 사용하면 치명적인 퍼포먼스가 발생하고 모든 동영상이 서로 동기화되어 있는지 확인할 수 있으므로 성능 문제가 가장 먼저 발생합니다.다른 하나에 TextureView 복제하기

답변 해 주셔서 감사합니다.

편집 : TextureView가 OpenGL을 사용하여 표면에 그려지기 때문에 onDraw() 무시는 작동하지 않습니다. 누군가가 그 행동을 복제하거나 무시할 수있는 방법에 대한 통찰력을 가지고 있다면. 다른 제안은 물론 환영합니다!

답변

1

원래, 나는 당신이 운이 될 줄 알았는데이이 같은 작업을 수행 할 TextureView의 onDraw(Canvas) 메서드를 재정의 간단한 경우가 있습니다 만 하나 CustomTextureView가 복용해야합니다

다음
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 * widthPerTitle, y * heightPerTile); 
      canvas.scale(widthScale, heightScale); 
      super.onDraw(canvas); 
      canvas.restore(); 
     } 
    } 
} 

전체 화면으로 표시되며 많은 시간이 걸릴 것이므로 많이 보일 것입니다.

그러나 이것은 TextureView의 작동 방식이 아닙니다. TextureView는 대신 더미 onDraw(Canvas) 메서드를 가지고 있으며, 대신 final 인 고유 한 draw(Canvas) 메서드를 사용하므로 오버라이드 할 수 없습니다. TextureView는 카메라에서 프레임을 그리기 위해 OpenGL을 사용하고 있습니다.이 과정에서 자신을 삽입하는 것은 꽤 복잡합니다. 예를 들어 here과 같은 예제가 있습니다. 이것은 진보 된 토픽이며 실제로 토요일 아침에 간결한 답을 쓰는 데 도움이 될 것입니다.

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 그리드와 나머지는이 CopyCatTextureViews이므로 각 복사본 고양이에 setTextureViewToCopy(TextureView)을 호출하여 단일 TextureView를 가리킨 다음 프레임 업데이트가 필요할 때마다 각 복사본 고양이에 invalidate()을 호출하면됩니다. 분명히 이것은 이상적은 아니지만, 단 하나의 프레임 만 원한다면 빠르며 확실히 작동 할 것입니다.

희망이 도움이됩니다. 행운을 빌어 요.

+0

나는 이것이 효과가있을 것이라고 생각하지 않습니다. 'TextureView'는 보통'View'처럼 그리지 않으며, IIRC는'onDraw()'final을 만듭니다. –

+0

네 말이 맞아. 마지막이야. 내가 뭘 할 수 있는지 보자. – DanielLaneDC

+0

나는 내 결과를 편집했습니다. – DanielLaneDC