O Android suporta o vídeo de escala?
-
20-09-2019 - |
Pergunta
Usando um videoview, é possível definir um fator de escala para Android? Por padrão, a visualização de vídeo se redimensiona para ajustar a resolução codificada do vídeo. Posso forçar o Android a renderizar um vídeo em um recto menor ou maior?
Solução
Por padrão, a visualização de vídeo se redimensiona para ajustar a resolução codificada do vídeo.
VideoView
(ou o SurfaceView
para usar com MediaPlayer
) será o tamanho que você diz para estar no seu layout. Dentro desse espaço, o vídeo será reproduzido o maior possível, mantendo a proporção.
Posso forçar o Android a renderizar um vídeo em um recto menor ou maior?
Sim: faça o seu VideoView
ser o tamanho que você deseja, e o Android escalará para caber no tamanho do VideoView
.
Outras dicas
(Eu sei que é uma pergunta muito antiga, mas há outra maneira de controlar as dimensões, que não são descritas aqui, talvez alguém seja útil.)
Declarar o seu próprio MyVideoView aula em seu layout e escreva o seu próprio OnMeasure () método. Aqui está como executar o vídeo estendido para as dimensões da View 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);
}
}
Acho que quando um videoview é colocado dentro de uma relatividade, o vídeo se estende Ambas Altura e largura para ajustar a altura e a largura especificadas da Videoview (independentemente da proporção de vídeo). No entanto, quando coloco o videoview em um Framelayout, o vídeo estica a altura e a largura até corresponder um de A altura ou largura especificada da Videoview (ou seja, não quebra a proporção). Estranho, eu sei, mas foi isso que eu encontrei!
Pôr "centerCrop"
tipo de escala para VideoView
sua onMeasure()
e layout()
Os métodos podem ser assim:
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);
}
}
Também estou tentando conseguir isso e até agora isso funcionou bem. A idéia é usar os SetLayoutParams para a exibição de vídeo e especificar o tamanho. É apenas um fragmento simples, mas dá a ideia. Verifique as linhas do 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();
Para Sentir -se bem responda.
Sem o método layout () o "Centercrop " O tipo de escala é melhor, mas o videoview deve estar em um Framelayout.
@Override
public void layout(int l, int t, int r, int b) {
super.layout(l + leftAdjustment, t + topAdjustment, r + leftAdjustment, b + topAdjustment);
}
Caras que eu tive outra ideia, crie sua própria aula de videoview, estendendo o VideoView, com isso que você pode fazer o que quiser. Exatamente você tem que criar alguns métodos em seu 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);
}
Faça seu próprio construtor para sua classe Videoview e verifique se esses métodos na sua própria classe videoview o usem como o Androids padrão videoview nos arquivos XML e da classe.
Espero que ajude.