这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发现预览时候还是差了点意思,具体看下面这个回调就知道是为什么了。

@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 平板预览变形,Android SurfaceView预览变形完美解决方法相关推荐

  1. android判断键盘是否弹出窗口,Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)...

    最近项目中有一个编辑框,下面是个ListView.在触发编辑框弹出软键盘后,ListView还能滑动,并且ListView的item还能响应单击.这样的体验效果很不好.于是便想在滑动或单击item时判 ...

  2. android 摄像头花屏_关于Android 4.4相机预览、录像花屏的问题的解决方法

    关于Android 4.4相机预览.录像花屏的问题的解决方法 系统: lc android4.4 在做前后摄像头录像的时候,发现会出现花屏的时候,但不是必现,可能会在某一次重启之后会出现,而且出现之后 ...

  3. android平板电脑的虚拟键盘,win10平板电脑不弹出虚拟键盘的两种解决方法

    平板电脑升级到了最新版Windows10系统后,发现在开机的时候没有弹出虚拟键盘,这样就没办法打字了,此问题对我们来说其实是比较少见的,如果真的出现这样的情况怎么办?今天小编就为大家整理了win10平 ...

  4. android 置灰不可点击,Android Studio 运行按钮灰色的完美解决方法

    Android Studio 运行按钮灰色的完美解决方法 今天新建项目的时候突然发现编译后运行按钮为灰色. 解决方案:第一步:点击图中的Add Configuration,出来如下界面 第二步:点+号 ...

  5. [转]Android fragment 重叠问题——通过hide,show方式导致的解决方法

    [转]Android fragment 重叠问题--通过hide,show方式导致的解决方法 参考文章: (1)[转]Android fragment 重叠问题--通过hide,show方式导致的解决 ...

  6. Android 在Fragment中执行onActivityResult不被调用的简单解决方法

    Android 在Fragment中执行onActivityResult不被调用的简单解决方法 参考文章: (1)Android 在Fragment中执行onActivityResult不被调用的简单 ...

  7. Android项目中出现的Plugin with id ‘kotlin-android‘ not found解决方法

    Android项目中出现的Plugin with id 'kotlin-android' not found解决方法 参考文章: (1)Android项目中出现的Plugin with id 'kot ...

  8. android app没有读写权限设置,Android 6.0以上权限拒绝打开权限设置界面的解决方法...

    本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小 ...

  9. Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法

    Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法 参考文章: (1)Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法 (2)https: ...

  10. Android Studio:xxx is not an enclosing class 错误的解决方法

    Android Studio:xxx is not an enclosing class 错误的解决方法 这个问题一般出现在内部类中,若要创建内部类的实例,需要有外部类的实例才行,或者是将内部类设置为 ...

最新文章

  1. pycharm配置python解释器_Python大佬手把手教你进行Pycharm活动模板配置
  2. POJ1887解题报告(最长下降子序列)
  3. spark 不同模式用途_Spark中那些常用的特征处理操作
  4. 【C语言】C语言实现面向对象编程之继承
  5. asp.net 返回超时的解决方法
  6. 查看数据库 MySQL 的版本信息的命令语句
  7. java io .log_namenode无法启动:java.io.FileNotFoundException: .log (Permission denied)
  8. ios审核一般要多久_水电施工要注意哪些问题?水电施工一般需要多久
  9. L1-064 估值一亿的AI核心代码 (20 分)—团体程序设计天梯赛
  10. VirtuoZo数字摄影测量(一)——单模型的建立
  11. 了解如何高速嵌入式?
  12. [资源整理]关于前端设计的那些博客儿~
  13. Windows下安装Tp6.0框架,图文。Thinkphp6.0安装教程
  14. 对于单峰函数(有唯一极值的函数),黄金分割法比二分法能用更少的搜索次数找到最优解(最值),这对于目标函数不可导时的最优解搜索很有效。
  15. 类、面向对象(封装、继承、多态),面向过程
  16. (转)国企,私企与外企利弊通观--关键时刻给应届毕业生及时点拨5
  17. 【安全牛学习笔记】TearDrop
  18. 华为路由器基础配置——IP配置
  19. 愤怒的小鸟4只编外鸟_愤怒的小鸟2编外怎么得
  20. bga焊盘怎么做_BGA焊盘设计标准及基本规则是什么

热门文章

  1. Fedora 添加国内源(sohu, 163)
  2. Unity 对接谷歌支付权限——若要添加应用内商品,您需要为 APK 添加 BILLING 权限
  3. JavaScript数组方法(最新)包含ES10方法
  4. 下午两点,要开始转数据了。开始计算机程序设计艺术之路
  5. 大学学什么课会用到matlab,高校蹭课?这份蹭课攻略请收好!| 内附福利
  6. 贴片电阻封装选型方法总结图文
  7. FFT推导之蝶形计算图推导
  8. 美团大众点评服务框架Pigeon
  9. Consul服务注册中心--Consul工作原理
  10. 想不想用另类的方式品尝心灵毒鸡汤,Python 5秒后到达战场