在我的Activity
中,我有SurfaceView
用于显示摄像头预览和几个控制按钮。这Activity
应该有两个工作案例:第一个,当方向是风景,相机预览比率设置为4:3时,第二个,当方向是肖像,并且相机预览应该是尖锐的。 我真正想要做的只是根据方向调整视图。 我已经尝试通过将android:configChanges="orientation|screenSize"
添加到我在manifest中的活动描述中来处理方向更改,但是这里的问题甚至被认为是onCreate()
方法未调用,活动组件已重新排列。我想这发生在我拨打super.onConfigurationChanged(null);
(我无法避免,因为我会得到例外)。 所以我的问题是,如果有可能实现我试图达到的效果?或者我别无选择,只能针对不同的方向有两个单独的布局,并允许重新创建活动? 在不触及布局的情况下捕捉Android活动的方向变化
1
A
回答
0
如果要做到这一点没有每个方向单独的布局,可以只是调整纵横比的方法的子类SurfaceView
(或TextureView
)。这实际上是在Camera sample applications Android团队使用方法:
public class AutoFitTextureView extends TextureView {
private int mRatioWidth = 0;
private int mRatioHeight = 0;
public AutoFitTextureView(Context context) {
this(context, null);
}
public AutoFitTextureView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setAspectRatio(int width, int height) {
if (width < 0 || height < 0) {
throw new IllegalArgumentException("Size cannot be negative.");
}
mRatioWidth = width;
mRatioHeight = height;
requestLayout();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if (0 == mRatioWidth || 0 == mRatioHeight) {
setMeasuredDimension(width, height);
} else {
if (width < height * mRatioWidth/mRatioHeight) {
setMeasuredDimension(width, width * mRatioHeight/mRatioWidth);
} else {
setMeasuredDimension(height * mRatioWidth/mRatioHeight, height);
}
}
}
}
那你还不需要重写onConfigurationChanged
,所有你需要做的是检查设备的方向onResume
之后的某个时间:
int orientation = getResources().getConfiguration().orientation;
if(orientation == Configuration.ORIENTATION_LANDSCAPE) {
mAutoFitTextureView.setAspectRatio(width, height);
} else {
mAutoFitTextureView.setAspectRatio(width, width);
}
相关问题
- 1. Android的方向变化和布局
- 2. 不同的方向变化布局
- 3. 无活动交互的布局方向变化
- 4. Android:在不创建新活动的情况下启动屏幕捕获
- 5. 如何在不显示预览的情况下捕捉图像
- 6. Android捕捉方向更改
- 7. Android - 在不改变布局的情况下在列表视图之间切换?
- 8. 在不改变布局的情况下替换文本的解决方案(jQuery)
- 9. 在不知道布局的情况下计算JavaFX动画值
- 10. 在不重新启动活动的情况下恢复活动
- 11. 在不改变背景的情况下开始活动
- 12. 在不破坏活动的情况下切换活动
- 13. 在不改变方向的情况下更改SCNNode位置
- 14. 布局Android活动
- 15. 如何在忽略局部变化的情况下拉屎?
- 16. Android - 保存网格布局内容时的方向变化
- 17. Android布局方向
- 18. 如何在不触及扩展Activity的主类的情况下监控我的应用中的用户活动?
- 19. 方向变化破坏了在android活动中的ftp上传?
- 20. 在启用布局的情况下手动呈现Zend_View
- 21. session.load()方法如何在不触及数据库的情况下提取数据?
- 22. Android - 在垂直向下滚动后捕捉布局(类似于happycog.com的顶级菜单)
- 23. 防止布局方向发生变化
- 24. 布局问题 - 如何在不移动某些UI元素的情况下启动一项活动?
- 25. 捕捉模态UIWebView链接触及
- 26. 在不使用布局的情况下创建标签式UI
- 27. 如何在不按下按钮的情况下开始活动?
- 28. 如何在不取消触摸的情况下启动动画?
- 29. 如何在不滚动的情况下触发滚动事件
- 30. Android - 在不使用布局的情况下向屏幕添加不同的视图(小部件)?
谢谢您的建议,Bryan。但是这种方法假设活动应该暂停然后重新开始。也许从我的信息来看,这并不清楚,但是当我的活动正在运行时,我需要处理方向的变化,并且想要达到效果,当除了表面变化之外没有可见的变化,在工作期间改变它的尺寸并且没有停顿(但我仍然不确定Android SDK是否有工具)。 – Yurii