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