Question

L'utilisation d'un VideoView est-il possible de définir un facteur d'échelle pour Android? Par défaut, la vue vidéo lui-même redimensionné pour adapter à la résolution codée de la vidéo. Puis-je forcer Android pour rendre une vidéo dans une plus petite ou plus rect?

Était-ce utile?

La solution

  

Par défaut, la vue vidéo redimensionne   elle-même pour correspondre à la résolution codée   de la vidéo.

VideoView (ou SurfaceView pour une utilisation avec MediaPlayer) sera la taille que vous lui dites dans votre mise en page. Dans cet espace , la vidéo lire aussi grand que possible tout en maintenant le rapport d'aspect.

  

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

Oui: rendre votre VideoView soit la taille que vous voulez, et Android sera pour ajuster la taille de la taille du VideoView

.

Autres conseils

(Je sais qu'il est très vieille question, mais il y a une autre façon de contrôler les dimensions, qui n'est pas décrite ici, peut-être quelqu'un sera utile.)

Déclarer votre MyVideoView classe dans votre mise en page et d'écrire votre propre onMeasure () méthode . Voici comment exécuter la vidéo étirée aux dimensions de voir l'original:


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);
 }
}

Je trouve que lorsqu'un VideoView est placé à l'intérieur d'un RelativeLayout, les tronçons vidéo à la fois hauteur et la largeur en fonction de la hauteur et la largeur spécifiée du VideoView (quel que soit l'aspect vidéo rapport). Cependant, quand je place le 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 du VideoView (il ne rompt pas le rapport d'aspect ). Étrange, je sais, mais c'est ce que je trouve!

Pour définir le type d'échelle "centerCrop" pour VideoView vos méthodes de 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);
    }
}

Je suis également en train de réaliser cela et jusqu'à présent cela a fonctionné ok. L'idée est d'utiliser les setLayoutParams pour la vue vidéo et spécifier la taille. Il est juste un simple fragment, mais il donne l'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();

FeelGoods réponse.

Sans la méthode mise en page () la " centerCrop" type d'échelle est mieux, mais le 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);
}

Les gars j'ai eu d'autre idée de créer votre propre classe VideoView en étendant VideoView, avec u peut faire ce que tu veux ,. exactement u doivent créer deux 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);
}

faire votre propre constructeur de classe ur VideoView et assurez-vous que ces méthodes dans ur propre classe VideoView puis l'utiliser comme comme androïdes VideoView par défaut dans les deux fichiers xml et classe.

it helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top