当前位置: 首页 > 知识库问答 >
问题:

在一个圆圈中显示ExoPlayer

常献
2023-03-14

我试着把第二个播放器放在一个有圆角的框架内(这个答案和这个答案),但是播放器总是会跳出父框架并绘制视频的完整矩形。

我发现这个解决方案使用GLSurfaceView,但是这个解决方案使用经典的MediaPlayer而不是ExoPlayer。

共有2个答案

宰父俊彦
2023-03-14

对于应该具有圆角的布局,可以在布局XML文件中设置以下内容:

app:surface_type="texture_view"

在这里找到了这个解决方案。

使用此功能的缺点主要是性能和电池使用(写在这里):

我应该使用SurfaceView还是TextureView?与TextureView相比,SurfaceView在视频播放方面有许多优点:

大大降低了许多设备的功耗。更精确的帧定时,使视频播放更流畅。播放受DRM保护的内容时支持安全输出。因此,在可能的情况下,SurfaceView应优先于TextureView。仅当SurfaceView不能满足您的需要时,才应使用TextureView。一个例子是,在Android N之前,需要平滑动画或滚动视频表面(请参见如何获得平滑动画/滚动视频?)。对于这种情况,最好仅在SDK_INT小于24(Android N)时使用TextureView,否则使用SurfaceView。

赵明亮
2023-03-14

你需要为它创建一个自定义容器。试试这个,把你的玩家视图放在里面。

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);
    }

}

}

 类似资料:
  • 问题内容: 因此,我试图绘制一个标签,其中包含一个显示圆圈的图标。圆圈最初将被填充为红色,然后根据我按下的三个按钮中的哪个按钮,将使用重绘将其更改为绿色,蓝色或红色。 这是我到目前为止的内容: 我的问题是,我不知道在paintIcon中如何传递Graphics g。有其他方法可以做到这一点吗?我对此表示感谢。 问题答案: 图标的大小为(10,10)。50,超出了Icon的范围。相对于图标完成绘制,

  • 问题内容: 我正在创建一个应用程序,该应用程序在gridPane的每个单元格内随机显示(不同颜色的)圆圈。 我想要做的是创建一个“随机播放”按钮,以随机更改gridPane中每个圆的位置。但是,我一直遇到很多问题。 这是我到目前为止所拥有的。我的两个类(尚未添加XML文件): 控制器类 主班 问题答案: 这是一个示例,演示了如何在。如果添加了一个,你可以删除从。然后,您可以随机播放。最后,您可以将

  • 我有一组数据,我正在分散地绘制。当我将鼠标滑过其中一个圆圈时,我希望它弹出数据(比如x、y值,可能更多)。以下是我尝试使用的: 我想我需要更多关于输入什么数据的信息?

  • 本文向大家介绍Android中TextView显示圆圈背景或设置圆角的方法,包括了Android中TextView显示圆圈背景或设置圆角的方法的使用技巧和注意事项,需要的朋友参考一下 前言 在我们学习android这么久,而且使用TextView那么长时间,我们一直没有用过给TextView添加背景,或者是给TextView添加添加边框,以及怎么样设置TextView的形状。今天在写代码的时候就用

  • 我正在创建一个应用程序,在一个gridPane的每个单元格内随机显示圆形(不同颜色)。 我想做的是创建一个“shuffle”按钮,在gridPane中随机改变每个圆的位置。然而,我不断遇到一大堆问题。 这是我到目前为止所拥有的。我的两个类(没有添加XML文件): 控制器类 主类

  • 我在一些项目上使用字体真棒,但我有一些事情,我想用字体真棒图标做,我可以很容易地调用这样的图标: 所有图标是否可能始终处于带边框的圆形中?像这样,我有一张照片: 使用 会产生效果,但问题是图标总是比旁边的文本或元素大,有什么解决方案吗?