web-dev-qa-db-fra.com

Android prend-il en charge la mise à l'échelle de la vidéo?

À l’aide de VideoView, est-il possible de définir un facteur d’échelle pour Android? Par défaut, la vue vidéo se redimensionne pour s'adapter à la résolution codée de la vidéo. Puis-je forcer Android à rendre une vidéo dans un rect plus petit ou plus grand?

26
haseman

Par défaut, la vue vidéo se redimensionne Pour s’adapter à la résolution codée De la vidéo.

VideoView (ou la SurfaceView à utiliser avec MediaPlayer) correspondra à la taille que vous indiquez dans votre mise en page. Dans cet espace , la vidéo sera lue aussi grande que possible tout en conservant le rapport hauteur/largeur.

Puis-je forcer Android à rendre une vidéo Dans un rect plus petit ou plus grand?

Oui: définissez votre VideoView à la taille souhaitée et Android évoluera pour s’adapter à la taille de VideoView.

9
CommonsWare

(Je sais que c'est une question très ancienne, mais il existe un autre moyen de contrôler les dimensions, ce qui n'est pas décrit ici. Peut-être que quelqu'un le trouvera utile.)

Déclarez votre propre MyVideoView class dans votre mise en page et écrivez votre propre onMeasure () méthode. Voici comment exécuter une vidéo étirée aux dimensions de View d'origine:


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
Michał Kowalczuk

Je constate que lorsqu'une VideoView est placée dans un RelativeLayout, la vidéo s'étire les deux hauteur et largeur pour s'adapter à la hauteur et à la largeur spécifiées par VideoView (quel que soit le rapport d'aspect de la vidéo). Cependant, lorsque je place VideoView dans un FrameLayout, la vidéo étend la hauteur et la largeur jusqu’à ce qu’elle corresponde à l’un des hauteur ou largeur spécifiée par VideoView (c’est-à-dire qu’elle ne casse pas les proportions). Etrange, je sais, mais c'est ce que j'ai trouvé!

10
Adil Hussain

Pour définir le type d'échelle "centerCrop" pour VideoView, vos méthodes onMeasure() et layout() peuvent ressembler à ceci:


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

J'essaie également d'y parvenir et jusqu'à présent, cela a fonctionné correctement. L'idée est d'utiliser les paramètres setLayoutParams pour la vue vidéo et de spécifier la taille. Ce n'est qu'un simple fragment mais cela donne une idée. Vérifiez les lignes LayoutParams.

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

Pour FeelGoods répondre.

Sans la méthode layout (), le type " centerCrop" scale est préférable, mais VideoView doit être dans un FrameLayout.

@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

Les gars, j'avais une autre idée: créer votre propre classe VideoView en étendant VideoView, avec lequel vous pouvez faire ce que vous voulez ,. exactement vous devez créer un couple de méthodes dans votre VideoView. 

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

}

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

créez votre propre constructeur pour votre classe VideoView et assurez-vous que cette méthode est utilisée dans votre propre classe de visioconférence, puis utilisez-la comme une vidéoview par défaut androïdes en fichiers xml et en classes.

J'espère que ça aide.

0
Murali