Изменить размер видео, чтобы соответствовать VideoView - PullRequest
17 голосов
/ 11 августа 2011

Я позиционирую VideoView с AbsoluteLayout (мне нужно отобразить его в нескольких местах на экране в определенных позициях).

public void showVideo(RectF bounds, final String videoUrl) {
    AbsoluteLayout.LayoutParams params = (AbsoluteLayout.LayoutParams) video.getLayoutParams();
    params.width = (int) bounds.width();
    params.height = (int) bounds.height();
    params.x = (int) bounds.left;
    params.y = (int) bounds.top;

    video.requestLayout();

    video.setVisibility(View.VISIBLE);
    video.setFocusable(true);
    video.setFocusableInTouchMode(true);
    video.requestFocus();

    File file = new File(videoUrl);
    video.setVideoPath(file.getAbsolutePath());
    video.start();
}

Но размер видео не изменяется в соответствии с указанными мною границами.

Любые советы?

Еще один связанный с этим вопрос: как заставить MediaController отображаться поверх VideoView?

Ответы [ 3 ]

16 голосов
/ 29 августа 2011

это очень близко к тому, что вы пытаетесь. если вы хотите создать подкласс для videoview и override onMeasure, вот решение. вам нужно

MyVideoView extends VideoView

/2896443/android-videoview-izmenenie-orientatsii-s-buferizovannym-video#2896448


как для показа MediaController через VidowView

Declare

private MediaController controller = null;

OnCreate

controller = new MediaController(this);
controller.setMediaPlayer(mcEvents);
controller.setAnchorView(findViewById(R.id.wrapper));

Активность

@Override
public boolean onTouchEvent(MotionEvent event) {
    //the MediaController will hide after 3 seconds - tap the screen to make it appear again
    controller.show();
    return false;
}

События Media Controller

private MediaController.MediaPlayerControl mcEvents = new MediaController.MediaPlayerControl() {        
    public void start() {
        player.start();
    }

    public void seekTo(int pos) {
        player.seekTo(pos);         
    }

    public void pause() {
        player.pause();
    }

    public boolean isPlaying() {            
        return player.isPlaying();
    }

    public int getDuration() {          
        return player.getDuration();
    }

    public int getCurrentPosition() {           
        return player.getCurrentPosition();
    }

    public int getBufferPercentage() {          
        return pBuffer;
    }

    public boolean canSeekForward() {           
        return true;
    }

    public boolean canSeekBackward() {
        return true;
    }

    public boolean canPause() {
        return true;
    }
};

пример файла макета

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/wrapper"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.my.views.MyViedoView
    android:id="@+id/player"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
/>
</FrameLayout>
10 голосов
/ 31 марта 2013

Вы можете изменить только файл макета:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <VideoView android:id="@+id/videoViewRelative"
         android:layout_alignParentTop="true"
         android:layout_alignParentBottom="true"
         android:layout_alignParentLeft="true"
         android:layout_alignParentRight="true"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent">
    </VideoView>

</RelativeLayout>
2 голосов
/ 12 августа 2011

После того, как вы измените LayoutParams, я думаю, вам нужно будет позвонить setLayoutParams, чтобы макет можно было обновить с новыми параметрами. После вызова setLayoutParams вам, возможно, придется вызвать метод reqestLayout, чтобы сделать недействительным макет и вызвать перерисовку представления.

Вам нужно будет создать новый экземпляр MediaController и использовать метод setMediaController для объекта VideoView.

...