千家信息网

Android SurfaceView预览变形怎么解决

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章主要介绍"Android SurfaceView预览变形怎么解决",在日常操作中,相信很多人在Android SurfaceView预览变形怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简
千家信息网最后更新 2025年01月21日Android SurfaceView预览变形怎么解决

这篇文章主要介绍"Android SurfaceView预览变形怎么解决",在日常操作中,相信很多人在Android SurfaceView预览变形怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Android SurfaceView预览变形怎么解决"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

看下面这个回调:

  @Override  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    Log.i(TAG, "surfaceChanged: " + width + " " + height);  }

从上面的回调打印的数据知道其实取相近的比例解决不了根本问题

所以,对于此类的解决方法我只想说仅仅相近有神马用。

那么既然知道surfaceChanged的宽高就是SurfaceView的渲染宽高,那么想办法把surfaceChanged里的宽高比弄成和camera比例一样不就行了嘛,所以看SurfaceView的源码:

protected void updateWindow(boolean force, boolean redrawNeeded) {    ...代码省略    int myWidth = mRequestedWidth;    if (myWidth <= 0) myWidth = getWidth();    int myHeight = mRequestedHeight;    if (myHeight <= 0) myHeight = getHeight();    ...代码省略          if (creating || formatChanged || sizeChanged        || visibleChanged || realSizeChanged) {      if (DEBUG) Log.i(TAG, System.identityHashCode(this) + " "          + "surfaceChanged -- format=" + mFormat          + " w=" + myWidth + " h=" + myHeight);      if (callbacks == null) {        callbacks = getSurfaceCallbacks();      }      for (SurfaceHolder.Callback c : callbacks) {        c.surfaceChanged(mSurfaceHolder, mFormat, myWidth, myHeight);      }    }        ...代码省略  }

可以看到宽高其实就是调用的View的getHeight和getWidth或者是mRequestedWidth和mRequestedHeight。

熟悉了View的自定义就知道getHeight和getWidth都是和View的onMeasure息息相关,所以想到重写onMeasure方法。

再从源码看到关于mRequestedWidth和mRequestedHeight的赋值

@Override    public void setFixedSize(int width, int height) {      if (mRequestedWidth != width || mRequestedHeight != height) {        mRequestedWidth = width;        mRequestedHeight = height;        requestLayout();      }    }

以下是完整类代码:

public class ResizeAbleSurfaceView extends SurfaceView {  private int mWidth = -1;  private int mHeight = -1;  public ResizeAbleSurfaceView(Context context) {    super(context);  }  public ResizeAbleSurfaceView(Context context, AttributeSet attrs) {    super(context, attrs);  }  public ResizeAbleSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);  }  @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    if (-1 == mWidth || -1 == mHeight) {      super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    else {      setMeasuredDimension(mWidth, mHeight);    }  }  public void resize(int width, int height) {    mWidth = width;    mHeight = height;    getHolder().setFixedSize(width, height);    requestLayout();    invalidate();   }}

实例化的时候记得调用resize方法就好了。

注意和camera的预览尺寸比例一致,且宽高记得传正确,不然可能不全屏

到此,关于"Android SurfaceView预览变形怎么解决"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

代码 方法 学习 比例 相近 就是 更多 源码 问题 帮助 实用 一致 息息相关 接下来 办法 实例 尺寸 数据 文章 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 用友u8初始化不了数据库 怎么打开网络安全限制 软件开发个人工作总结 新云东方服务器 梦幻西游山东区合区的服务器 创乐网络技术北京有限公司 oa连接数据库 自动挂单软件开发 留言板系统连接数据库页面 上海品牌网络技术收费 快运客软件开发公司 产业互联网的科技 江西软件开发定制大概费用 万方数据库杂志下架还是隐藏 阿拉德之怒mg版本是什么服务器 开展网络安全活动手抄报里面的字 用友财务需要填写服务器名称吗 三级网络技术大题判卷 中国共和国网络安全法题库 上海做物流软件开发的公司 从事软件开发的人做什么 金山区企业网络技术服务欢迎咨询 深圳软件开发工作室 mirbase数据库怎么打开 关于互联网的图片 科技 云服务器安全防护系统 正则表达式 数据库 镇街网络安全周宣传 数据库表修改字符集 首届网络安全周在哪举办
0