android视频放大缩小编辑,Android视频缩放

private WeakReference weak ;

在start()之前调用下面的方法

//重新计算video的显示位置,让其全部显示并据中

public void updateSizeCenter(){

int mVideoWidth = mMediaPlayer.getVideoWidth();

int mVideoHeight = mMediaPlayer.getVideoHeight();

float sx = (float) weak.get().getWidth() / (float) mVideoWidth;

float sy = (float) weak.get().getHeight() / (float) mVideoHeight;

Matrix matrix = new Matrix();

//第1步:把视频区移动到View区,使两者中心点重合.

matrix.preTranslate((weak.get().getWidth() - mVideoWidth) / 2, (weak.get().getHeight() - mVideoHeight) / 2);

//第2步:因为默认视频是fitXY的形式显示的,所以首先要缩放还原回来.

matrix.preScale(mVideoWidth / (float) weak.get().getWidth(), mVideoHeight / (float) weak.get().getHeight());

//第3步,等比例放大或缩小,直到视频区的一边和View一边相等.如果另一边和view的一边不相等,则留下空隙

if (sx >= sy){

matrix.postScale(sy, sy, weak.get().getWidth() / 2, weak.get().getHeight() / 2);

}else{

matrix.postScale(sx, sx, weak.get().getWidth() / 2, weak.get().getHeight() / 2);

}

weak.get().setTransform(matrix);

weak.get().postInvalidate();

}

//重新计算video的显示位置,裁剪后全屏显示

public void updateSizeCenterCrop(){

int mVideoWidth = mMediaPlayer.getVideoWidth();

int mVideoHeight = mMediaPlayer.getVideoHeight();

float sx = (float) weak.get().getWidth() / (float) mVideoWidth;

float sy = (float) weak.get().getHeight() / (float) mVideoHeight;

Matrix matrix = new Matrix();

float maxScale = Math.max(sx, sy);

//第1步:把视频区移动到View区,使两者中心点重合.

matrix.preTranslate((weak.get().getWidth() - mVideoWidth) / 2, (weak.get().getHeight() - mVideoHeight) / 2);

//第2步:因为默认视频是fitXY的形式显示的,所以首先要缩放还原回来.

matrix.preScale(mVideoWidth / (float)weak.get(). getWidth(), mVideoHeight / (float) weak.get().getHeight());

//第3步,等比例放大或缩小,直到视频区的一边超过View一边, 另一边与View的另一边相等. 因为超过的部分超出了View的范围,所以是不会显示的,相当于裁剪了.

matrix.postScale(maxScale, maxScale, weak.get().getWidth() / 2, weak.get().getHeight() / 2);//后两个参数坐标是以整个View的坐标系以参考的

weak.get().setTransform(matrix);

weak.get().postInvalidate();

}

要在 Android 中进行视频放大缩小操作,可以使用 TextureView 和 ScaleGestureDetector 类。TextureView 是一个可以用来显示视频的控件,而 ScaleGestureDetector 可以监测两个手指之间的距离变化,并据此进行缩放操作。以下是一个简单的示例代码,可以将 TextureView 控件进行放大缩小操作: ```java public class MainActivity extends AppCompatActivity { private TextureView mTextureView; private MediaPlayer mMediaPlayer; private ScaleGestureDetector mScaleGestureDetector; private float mScaleFactor = 1.0f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextureView = findViewById(R.id.texture_view); mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() { @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i1) { try { AssetFileDescriptor afd = getAssets().openFd("video.mp4"); mMediaPlayer = new MediaPlayer(); mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); mMediaPlayer.setSurface(new Surface(surfaceTexture)); mMediaPlayer.prepare(); mMediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i1) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { } }); mScaleGestureDetector = new ScaleGestureDetector(this, new ScaleListener()); } @Override public boolean onTouchEvent(MotionEvent event) { mScaleGestureDetector.onTouchEvent(event); return true; } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScale(ScaleGestureDetector detector) { mScaleFactor *= detector.getScaleFactor(); mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 10.0f)); mTextureView.setScaleX(mScaleFactor); mTextureView.setScaleY(mScaleFactor); return true; } } } ``` 在这个示例代码中,我们在 onCreate() 方法中获取了一个 TextureView 控件,并创建了一个 ScaleGestureDetector 对象。然后,我们在 TextureView 的 SurfaceTextureListener 中创建了一个 MediaPlayer 对象,并将其与 TextureView 控件进行关联,以实现视频的播放。注意,在这个示例代码中,我们假设视频文件名为 video.mp4,并将其放在 app/src/main/assets 目录下。 我们还重写了 onTouchEvent() 方法,并在其中调用 ScaleGestureDetector 对象的 onTouchEvent() 方法,以便进行缩放操作。 最后,我们定义了一个 ScaleListener 类,用于监测缩放操作,并在缩放时调整 TextureView 控件的缩放比例。在 onScale() 方法中,我们使用了 detector.getScaleFactor() 方法获取缩放因子,然后将其乘以当前的缩放比例,并在最后使用 Math.max() 和 Math.min() 方法确保缩放比例在合理的范围内。最后,我们使用 setScaleX() 和 setScaleY() 方法设置 TextureView 控件的缩放比例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值