android 平板预览变形,Android SurfaceView预览变形完美解决方法
这个问题百度上一搜一大把,基本上都是说找到和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预览变形完美解决方法相关推荐
- android判断键盘是否弹出窗口,Android判断软键盘弹出并隐藏的简单完美解决方法(推荐)...
最近项目中有一个编辑框,下面是个ListView.在触发编辑框弹出软键盘后,ListView还能滑动,并且ListView的item还能响应单击.这样的体验效果很不好.于是便想在滑动或单击item时判 ...
- android 摄像头花屏_关于Android 4.4相机预览、录像花屏的问题的解决方法
关于Android 4.4相机预览.录像花屏的问题的解决方法 系统: lc android4.4 在做前后摄像头录像的时候,发现会出现花屏的时候,但不是必现,可能会在某一次重启之后会出现,而且出现之后 ...
- android平板电脑的虚拟键盘,win10平板电脑不弹出虚拟键盘的两种解决方法
平板电脑升级到了最新版Windows10系统后,发现在开机的时候没有弹出虚拟键盘,这样就没办法打字了,此问题对我们来说其实是比较少见的,如果真的出现这样的情况怎么办?今天小编就为大家整理了win10平 ...
- android 置灰不可点击,Android Studio 运行按钮灰色的完美解决方法
Android Studio 运行按钮灰色的完美解决方法 今天新建项目的时候突然发现编译后运行按钮为灰色. 解决方案:第一步:点击图中的Add Configuration,出来如下界面 第二步:点+号 ...
- [转]Android fragment 重叠问题——通过hide,show方式导致的解决方法
[转]Android fragment 重叠问题--通过hide,show方式导致的解决方法 参考文章: (1)[转]Android fragment 重叠问题--通过hide,show方式导致的解决 ...
- Android 在Fragment中执行onActivityResult不被调用的简单解决方法
Android 在Fragment中执行onActivityResult不被调用的简单解决方法 参考文章: (1)Android 在Fragment中执行onActivityResult不被调用的简单 ...
- Android项目中出现的Plugin with id ‘kotlin-android‘ not found解决方法
Android项目中出现的Plugin with id 'kotlin-android' not found解决方法 参考文章: (1)Android项目中出现的Plugin with id 'kot ...
- android app没有读写权限设置,Android 6.0以上权限拒绝打开权限设置界面的解决方法...
本人使用小米手机,打开qq或者微信的时候,某个权限拒绝的话,会提示你开启,点击开启会跳转到app的权限设置界面,当然了,这是国内系统深层定制的原因,也就是说这个界面原声的android没有的!这里以小 ...
- Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法
Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法 参考文章: (1)Android实现EditText禁止输入换行符但可以根据内容自动换行的解决方法 (2)https: ...
- Android Studio:xxx is not an enclosing class 错误的解决方法
Android Studio:xxx is not an enclosing class 错误的解决方法 这个问题一般出现在内部类中,若要创建内部类的实例,需要有外部类的实例才行,或者是将内部类设置为 ...
最新文章
- pycharm配置python解释器_Python大佬手把手教你进行Pycharm活动模板配置
- POJ1887解题报告(最长下降子序列)
- spark 不同模式用途_Spark中那些常用的特征处理操作
- 【C语言】C语言实现面向对象编程之继承
- asp.net 返回超时的解决方法
- 查看数据库 MySQL 的版本信息的命令语句
- java io .log_namenode无法启动:java.io.FileNotFoundException: .log (Permission denied)
- ios审核一般要多久_水电施工要注意哪些问题?水电施工一般需要多久
- L1-064 估值一亿的AI核心代码 (20 分)—团体程序设计天梯赛
- VirtuoZo数字摄影测量(一)——单模型的建立
- 了解如何高速嵌入式?
- [资源整理]关于前端设计的那些博客儿~
- Windows下安装Tp6.0框架,图文。Thinkphp6.0安装教程
- 对于单峰函数(有唯一极值的函数),黄金分割法比二分法能用更少的搜索次数找到最优解(最值),这对于目标函数不可导时的最优解搜索很有效。
- 类、面向对象(封装、继承、多态),面向过程
- (转)国企,私企与外企利弊通观--关键时刻给应届毕业生及时点拨5
- 【安全牛学习笔记】TearDrop
- 华为路由器基础配置——IP配置
- 愤怒的小鸟4只编外鸟_愤怒的小鸟2编外怎么得
- bga焊盘怎么做_BGA焊盘设计标准及基本规则是什么