在不触及布局的情况下捕捉Android活动中的方向更改

时间:2016-10-04 15:49:30

标签: android

Activity我有SurfaceView用于显示相机预览和少量控制按钮。这个Activity应该有两个工作案例:第一个,当方向是横向和相机预览比率设置为4:3,第二个,当方向是纵向,相机预览应该是squeare。 我真正想做的只是根据方向调整视图。 我已经尝试通过将android:configChanges="orientation|screenSize"添加到清单中的活动描述来处理我的活动中的方向更改,但这里的问题甚至被认为onCreate()方法未被调用,活动组件被重新排列。我想这发生在我打电话给super.onConfigurationChanged(null);时(我无法避免,因为我会得到例外)。 所以我的问题是,是否有可能达到我想要达到的效果?或者我别无选择,只能为不同的方向设置两个独立的布局,并允许重建活动? This is how my acitivyt look like in portrait mode And this is what I get when rotate my device

1 个答案:

答案 0 :(得分:0)

如果您希望在没有针对每个方向的单独布局的情况下执行此操作,则可以使用方法对kubectl get hpa(或SurfaceView)进行子类化以调整宽高比。这实际上是Android团队在Camera sample applications中使用的方法:

TextureView

然后您不需要覆盖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