2017-05-18 9 views
6

ich einen ExoPlayerView innerhalb eines Kreises anzuzeigen versuchen, ein anderes ExoPlayer (Bild im Bild), die über: enter image description hereAndroid - angezeigte ExoPlayer in einem Kreis

Ich habe versucht, in einem Rahmen mit abgerundeten Ecken und den zweiten Spieler setzen (Sowohl this answer als auch this one), aber der Player wird immer aus dem übergeordneten Frame entkommen und das volle Rechteck des Videos zeichnen.

Ich fand this solution, die eine GLSurfaceView verwendet, jedoch verwendet diese Lösung den klassischen MediaPlayer und nicht ExoPlayer.

+0

Haben Sie versucht, die Lösung mit Ihnen die GLSurfaceView verknüpft und mit genau wie Sie eine Surface mit ExoPlayer verwenden würde? (Einrichten des Oberflächenhörers und Übergeben der Oberfläche an den ExoPlayer) – etan

+0

Jeder, der darauf reinkommt, verwendet TextureViews anstelle von SurfaceViews –

Antwort

0

Sie müssen einen benutzerdefinierten Container dafür erstellen. Probiere das aus und bringe die Spieleransicht hinein.

public class RoundFrameLayout extends FrameLayout { 

private final Path clip = new Path(); 

private int posX; 
private int posY; 
private int radius; 

public RoundFrameLayout(Context context) { 
    this(context,null); 

} 

public RoundFrameLayout(Context context, AttributeSet attrs) { 
    this(context, attrs,0); 
} 

public RoundFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    // We can use outlines on 21 and up for anti-aliased clipping. 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     setClipToOutline(true); 
    } 
} 

@Override 
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight) { 
    posX = Math.round((float) width/2); 
    posY = Math.round((float) height/2); 

    // noinspection NumericCastThatLosesPrecision 
    radius = (int) Math.floor((float) Math.min(width, height)/2); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     setOutlineProvider(new OutlineProvider(posX, posY, radius)); 
    } else { 
     clip.reset(); 
     clip.addCircle(posX, posY, radius, Direction.CW); 
    } 
} 

@Override 
protected void dispatchDraw(Canvas canvas) { 
    // Not needed on 21 and up since we're clipping to the outline instead. 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { 
     canvas.clipPath(clip); 
    } 

    super.dispatchDraw(canvas); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    // Don't pass touch events that occur outside of our clip to the children. 
    float distanceX = Math.abs(event.getX() - posX); 
    float distanceY = Math.abs(event.getY() - posY); 
    double distance = Math.hypot(distanceX, distanceY); 

    return distance > radius; 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
static class OutlineProvider extends ViewOutlineProvider { 

    final int left; 
    final int top; 
    final int right; 
    final int bottom; 

    OutlineProvider(int posX, int posY, int radius) { 
     left = posX - radius; 
     top = posY - radius; 
     right = posX + radius; 
     bottom = posY + radius; 
    } 

    @Override 
    public void getOutline(View view, Outline outline) { 
     outline.setOval(left, top, right, bottom); 
    } 

} 

}

+0

Wie in der Frage erwähnt, funktioniert diese Lösung nicht, da der Player die abgerundeten Ecken nicht berücksichtigt des übergeordneten Rahmens. –