【问题标题】:Android Studio - How to avoid VideoView overflowing its (View) container?Android Studio - 如何避免 VideoView 溢出其(视图)容器?
【发布时间】: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_width="match_parent"
android:layout_height="match_parent"
tools:context=".temporal.MainActivity">

<LinearLayout
    android:id="@+id/viewContainer"
    android:layout_width="wrap_content"
    android:layout_height="150dp"
    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_width="150dp"
        android:layout_height="150dp"
        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_width="150dp"
            android:layout_height="150dp"
            android:layout_gravity="center"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="150dp"
        android:layout_height="150dp"
        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_width="150dp"
            android:layout_height="150dp"
            android:layout_gravity="center"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="150dp"
        android:layout_height="150dp"
        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_width="150dp"
            android:layout_height="150dp"
            android:layout_gravity="center"/>

    </LinearLayout>

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

【问题讨论】:

  • 您好,我也遇到了同样的问题,您找到解决方案了吗?

标签: android containers android-videoview overlap


【解决方案1】:

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

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

【讨论】:

  • 非常好,ScalableVideoView 工作得很好。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2018-04-13
  • 1970-01-01
相关资源
最近更新 更多