Android Studio - 如何避免 VideoView 溢出其(视图)容器?

Posted

技术标签:

【中文标题】Android Studio - 如何避免 VideoView 溢出其(视图)容器?【英文标题】:Android Studio - How to avoid VideoView overflowing its (View) container? 【发布时间】:2020-08-28 18:38:35 【问题描述】:

我在水平线性布局中有 3 个视频视图,我希望每个视频都播放不同的视频,每个视频只会显示其原始视频的一部分(因此每个视频都包含在一个线性布局中,限制了应该从 150dp 显示的内容到 150dp)。 问题是视频重叠。作为一个例子,我展示了我只填充 VideoView Central 但它侵入了其他 VideoViews 的区域的代码,我已经尝试了所有方法,但我不能让它们不互相侵入。任何想法如何解决它。 注意: VideoView 必须大于其 150x150dp LinearLayout 容器。

在这张图片中,我显示 Actual Error and Correct Result wanted

import android.media.MediaPlayer
import android.net.Uri
import android.os.Bundle
import android.util.DisplayMetrics
import android.widget.MediaController
import com.uncdf.unitlife.R
import com.uncdf.unitlife.util.ActBase
import com.uncdf.unitlife.util.TestCustomVideoView
import com.uncdf.unitlife.util.Utiles

class MainActivity : ActBase() 

override fun onCreate(savedInstanceState: Bundle?) 
    try
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        init()
    catch (ex: java.lang.Exception)
        Utiles.manageViewException(ex, baseContext, getEventCode("0001"))
    


fun init()

    initVideo(R.id.viewVideoX2)
    


fun initVideo(idViewVideo : Int)
    val video = findViewById<TestCustomVideoView>(idViewVideo)

    video?.setMediaController(MediaController(this));
    video?.setOnPreparedListener(MediaPlayer.OnPreparedListener() 
        // it.setVideoScalingMode(MediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING)
        it.isLooping = true
        // itemInfo.videoMediaPlayer = it
    )

    val metrics = DisplayMetrics()
    windowManager.defaultDisplay.getMetrics(metrics)
    video?.setContainer(736, 412, true)

    // "http://www.demonuts.com/Demonuts/smallvideo.mp4"
    var rutaVideo =  "android.resource://" + packageName + "/" + R.raw.smallvideo;
    video?.setVideoURI(Uri.parse(rutaVideo))
    video?.requestFocus()
    video?.seekTo(5)
    video.setZOrderMediaOverlay(false)
    // viewVideoFull?.start()






import android.content.Context;
import android.graphics.Canvas;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.util.AttributeSet;
import android.util.Size;
import android.widget.VideoView;

public class TestCustomVideoView extends VideoView 

private Size finalVideoSize = new Size(0,0);
private boolean isOut = false;

public TestCustomVideoView(Context context) 
    super(context);


public TestCustomVideoView(Context context, AttributeSet attrs) 
    super(context, attrs);


public TestCustomVideoView(Context context, AttributeSet attrs, int defStyle) 
    super(context, attrs, defStyle);


public void setContainer(int width, int height, boolean outContainer)
    this.finalVideoSize = new Size(width, height);
    setMeasuredDimension(finalVideoSize.getWidth(), finalVideoSize.getHeight());


@Override
public void setVideoURI(Uri uri) 

    super.setVideoURI(uri);

    if(finalVideoSize.getWidth() > 0 && finalVideoSize.getHeight() > 0)
        setMeasuredDimension(finalVideoSize.getWidth(), finalVideoSize.getHeight());


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    if(finalVideoSize.getWidth() > 0 && finalVideoSize.getHeight() > 0)
        setMeasuredDimension(finalVideoSize.getWidth(), finalVideoSize.getHeight());
    else
        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);




    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".temporal.MainActivity">

<LinearLayout
    android:id="@+id/viewContainer"
    android:layout_
    android:layout_
    android:orientation="horizontal"

    android:background="@android:color/holo_orange_light"

    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintWidth_percent=".9">

    <LinearLayout
        android:layout_
        android:layout_
        android:gravity="center"

        android:background="@android:color/holo_green_light"
        android:layout_marginLeft="20dp">

        <com.uncdf.unitlife.util.TestCustomVideoView
            android:id="@+id/viewVideoX1"
            android:layout_
            android:layout_
            android:layout_gravity="center"/>

    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:gravity="center"

        android:background="@android:color/holo_green_light"
        android:layout_marginLeft="20dp">

        <com.uncdf.unitlife.util.TestCustomVideoView
            android:id="@+id/viewVideoX2"
            android:layout_
            android:layout_
            android:layout_gravity="center"/>

    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        android:gravity="center"

        android:background="@android:color/holo_green_light"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp">

        <com.uncdf.unitlife.util.TestCustomVideoView
            android:id="@+id/viewVideoX3"
            android:layout_
            android:layout_
            android:layout_gravity="center"/>

    </LinearLayout>

</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

您好,我也遇到了同样的问题,您找到解决方案了吗? 【参考方案1】:

嘿,我偶然发现了类似的东西,我发现的问题是 VideoView 本身扩展了 surfaceView。所以我选择尝试使用 textureView 播放视频,这是我使用的库,它帮助我处理错误。ScalableVideoView

如果您在实施此库时遇到任何其他问题,请告诉我

【讨论】:

非常好,ScalableVideoView 工作得很好。非常感谢。

以上是关于Android Studio - 如何避免 VideoView 溢出其(视图)容器?的主要内容,如果未能解决你的问题,请参考以下文章

Android studio 解决避免覆盖安装的问题

如何解决Android Studio导入项目非常慢的问题?

android studio中的按钮颜色不会改变

Android Studio 解决重复依赖

android studio 需要安装sdk吗

如何消除间接呼叫 Method 在 Android Studio 中的编译警告