À 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?
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
.
(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);
}
}
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é!
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);
}
}
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();
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);
}
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.