关于SurfaceView横竖屏切换显示问题

我们一般都会用SurfaceView做预览和播放,话不多说,直接上代码清单文件中设置好代码中实现onConfigurationChanged()方法

android:configChanges="orientation|screenSize

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//竖屏显示

        LayoutParams lp = mSurface.getLayoutParams();
        lp.width = lp.MATCH_PARENT;
        lp.height = 680;
        mSurface.setLayoutParams(lp);


    } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
 
//横屏显示
        LayoutParams lp = mSurface.getLayoutParams();
        lp.width = lp.MATCH_PARENT;
        lp.height =lp.MATCH_PARENT;
        mSurface.setLayoutParams(lp);

    }

通过判断横竖屏来设置surfaceView的宽高就可以了,有的需求是横竖屏切换后要保持一定的比例,请看下面

DisplayMetrics dm = new DisplayMetrics();
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);

    int screenWidth = dm.widthPixels;

    int screenHeigh = dm.heightPixels;
    LayoutParams lp = mSurface.getLayoutParams();
    lp.width = screenWidth;
    lp.height = screenWidth * 9/16;

    mSurface.setLayoutParams(lp);

} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    ((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(dm);

    int screenWidth = dm.widthPixels;

    int screenHeigh = dm.heightPixels;
    LayoutParams lp = mSurface.getLayoutParams();
    lp.width = screenHeigh*16/9;
    lp.height =screenHeigh;
    mSurface.setLayoutParams(lp);
}

获取手机系统的宽高,你想要什么比例就按比例计算就可以了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当Android SurfaceView时,可能是由于以下几个原因: 1. 帧率问题SurfaceView 绘制和更新的速度超过了设备的处理能力,导致卡顿。解决办法可以是降低绘制帧率,可以通过减少绘制操作或延迟绘制间隔来解决。 2. UI 线程阻塞:在 UI 线程中执行过多耗时操作,导致 SurfaceView 无法及时刷新,从而出现卡现象。解决方法是将耗时操作移到子线程中执行,或者优化耗时操作,减少其执行时间。 3. 内存管理问题:如果应用过于占用内存,会导致系统内存不足,从而影响 SurfaceView 的正常运行。可以通过检查内存泄漏和优化内存使用来解决此问题。 4. 多线程同步问题SurfaceView 可能会在多个线程中进行读写操作,如果没有进行良好的同步控制,会导致卡顿。需要确保在进行绘制时,其他线程不会修改 SurfaceView 的状态。 5. 渲染层级问题:如果在 SurfaceView 之上还存在其他 View,它们可能会遮挡住 SurfaceView,导致其内容无法显示。需要确保 SurfaceView 处于正确的层级,并正确处理事件分发。 综上所述,当 Android SurfaceView时,可能是由于帧率问题、UI 线程阻塞、内存管理问题、多线程同步问题或者渲染层级问题导致的。可以通过降低绘制帧率、优化耗时操作、检查内存泄漏、进行良好的同步控制和正确处理层级关系等方法来解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值