webentwicklung-frage-antwort-db.com.de

Unterstützt Android das Skalieren von Videos?

Kann man mit einem VideoView einen Skalierungsfaktor für Android einstellen? Standardmäßig passt sich die Größe der Videoansicht an die codierte Auflösung des Videos an. Kann ich Android zwingen, ein Video in ein kleineres oder größeres Rechteck zu rendern?

26
haseman

Standardmäßig ändert die Videoansicht Selbst, um sie an die kodierte Auflösung Des Videos anzupassen.

VideoView (oder der SurfaceView zur Verwendung mit MediaPlayer) hat die Größe, die Sie in Ihrem Layout angeben. Innerhalb dieses Bereichs wird das Video unter Beibehaltung des Seitenverhältnisses so groß wie möglich wiedergegeben.

Kann ich Android zwingen, ein Video In ein kleineres oder größeres Rechteck zu rendern?

Ja: Legen Sie fest, dass VideoView die gewünschte Größe hat, und Android wird an die Größe von VideoView angepasst.

9
CommonsWare

(Ich weiß, es ist eine sehr alte Frage, aber es gibt eine andere Möglichkeit, Dimensionen zu kontrollieren, die hier nicht beschrieben wird, vielleicht wird sie jemand hilfreich sein.)

Deklarieren Sie Ihre eigene MyVideoView -Klasse in Ihrem Layout und schreiben Sie Ihre eigene onMeasure () - Methode. So führen Sie ein Video in Originalgröße von View aus:


public class MyVideoView extends VideoView {
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  int width = getDefaultSize(0, widthMeasureSpec);
  int height = getDefaultSize(0, heightMeasureSpec);

  setMeasuredDimension(width, height);
 }
}
56

Ich finde, wenn ein VideoView in einem RelativeLayout platziert wird, dehnt sich das Video mit beide Höhe und Breite aus, um die angegebene Höhe und Breite des VideoView (unabhängig vom Video-Seitenverhältnis) anzupassen. Wenn ich jedoch das VideoView in einem FrameLayout platziere, dehnt sich das Video in Höhe und Breite aus, bis es mit einem von der angegebenen Höhe oder Breite des VideoView übereinstimmt (d. H. Das Seitenverhältnis wird nicht unterbrochen). Merkwürdig, ich weiß, aber das habe ich gefunden!

10
Adil Hussain

Um "centerCrop" Skalentyp für VideoView festzulegen, können Ihre onMeasure()- und layout()-Methoden folgendermaßen aussehen:


public class CenterCropVideoView extends VideoView {
    private int leftAdjustment;
    private int topAdjustment;

 ...
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int videoWidth = getMeasuredWidth();
        int videoHeight = getMeasuredHeight();

        int viewWidth = getDefaultSize(0, widthMeasureSpec);
        int viewHeight = getDefaultSize(0, heightMeasureSpec);

        leftAdjustment = 0;
        topAdjustment = 0;
        if (videoWidth == viewWidth) {
            int newWidth = (int) ((float) videoWidth / videoHeight * viewHeight);
            setMeasuredDimension(newWidth, viewHeight);
            leftAdjustment = -(newWidth - viewWidth) / 2;
        } else {
            int newHeight = (int) ((float) videoHeight / videoWidth * viewWidth);
            setMeasuredDimension(viewWidth, newHeight);
            topAdjustment = -(newHeight - viewHeight) / 2;

        }
    }

    @Override
    public void layout(int l, int t, int r, int b) {
        super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
    }
}
10
FeelGood

Ich versuche das auch zu erreichen und das hat bisher gut funktioniert. Die Idee ist, setLayoutParams für die Videoansicht zu verwenden und die Größe anzugeben. Es ist nur ein einfaches Fragment, aber es gibt die Idee. Überprüfen Sie die LayoutParams-Zeilen.

VideoView mVideoView = new VideoView(this);

//intermediate code

mVideoView.setVideoPath("/sdcard/VIDEO0007.3gp");
MediaController mController = new MediaController(this);
mVideoView.setMediaController(mController);
mController.setOnTouchListener(new View.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {
    int width = mVideoView.getMeasuredWidth();
    int height = mVideoView.getMeasuredHeight();
    //we add 10 pixels to the current size of the video view every time you touch     
    //the media controller.
    LayoutParams params = new LinearLayout.LayoutParams(width+10, height+10);
    mVideoView.setLayoutParams(params);

    return true;
}
});

mVideoView.requestFocus();
mVideoView.start();
3
silver_mx

Zu FeelGoods antworten.

Ohne die Methode layout () ist der Skalentyp " centerCrop" besser, aber die VideoView muss sich in einem FrameLayout befinden.

@Override
public void layout(int l, int t, int r, int b) {
    super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}
2
Joao Ferreira

Ich hatte eine andere Idee, eine eigene VideoView-Klasse zu erstellen, indem Sie VideoView erweitern. Damit können Sie tun, was Sie wollen. genau müssen Sie einige Methoden in Ihrem VideoView erstellen. 

public void setDimensions(int w, int h) {
    this.mForceHeight = h;
    this.mForceWidth = w;

}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(mForceWidth, mForceHeight);
}

erstellen Sie Ihren eigenen Konstruktor für Ihre VideoView-Klasse. Stellen Sie sicher, dass diese Methoden in Ihrer eigenen Videoview-Klasse als Androids-Standardvideoansicht in XML- und Klassendateien verwendet werden.

Ich hoffe es hilft.

0
Murali