camera.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/camera_root_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="ltr">
<com.android.camera.ui.TalkbackView
android:id="@+id/talkback_view"
android:layout_width="1px"
android:layout_height="1px"
android:focusable="true"
android:alpha="0" />
<com.android.camera.ui.CameraRootView
android:id="@+id/camera_photo_root"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
......
......
......
<com.android.camera.ui.GridSurfaceView
android:id="@+id/preview_grid_wire"
android:visibility="invisible"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
.....
</FrameLayout>
public class GridSurfaceView extends View {
/**竖向线条数,可通过布局属性设置列数*/
private int linesX = 2;
/** 竖向线条数,可通过布局属性设置行*/
private int linesY = 2;
/**是否显示或者网格和方形*/
private int type = OFFWIRE;
private static final int OFFWIRE = 0;
private static final int ON_SQUARE_WIRE = 2;
private static final int ON_GRIDDING_WIRE = 1;
private int width ;
private int height ;
private int top ;
private int bottom ;
private Paint mPaint = null;
public GridSurfaceView(Context context) {
super(context);
init();
}
public GridSurfaceView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public GridSurfaceView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public int getLinesX() {
return linesX;
}
public void setLinesX(int linesX) {
this.linesX = linesX;
}
public int getLinesY() {
return linesY;
}
public void setLinesY(int linesY) {
this.linesY = linesY;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
private void init(){
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getRealMetrics(dm);
width = dm.widthPixels;
height = dm.heightPixels;
mPaint = new Paint();
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(1);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getContext());
String netWire = pref.getString(SettingsManager.KEY_NET_WIRE_SUER,"0");
this.type = Integer.parseInt(netWire);
this.top = top;
this.bottom = bottom;
Log.d("onLayout = ", left + " -" + top + " -" + bottom + " -" + right + " width=" + width + "height=" + height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.d("onDraw = ", " width=" + width + "height=" + height);
switch (type){
case OFFWIRE://off
break;
case ON_SQUARE_WIRE:
if(width > (bottom - top)) {
int startX = (width - (bottom - top)) / 2;
canvas.drawLine(startX, 0, startX, (bottom - top), mPaint);
canvas.drawLine(startX + (bottom - top), 0, startX + (bottom - top), (bottom - top), mPaint);
return;
}
int square_y = (bottom - top - width) / 2;
if (square_y < 0){
return;
}
canvas.drawLine(0, square_y, width, square_y, mPaint);
canvas.drawLine(0, square_y + width - 2, width, square_y + width - 2, mPaint);
break;
case ON_GRIDDING_WIRE:
int gridding_x = width/(linesX + 1);
int gridding_y = (bottom - top)/(linesY + 1);
for(int i = 1 ; i <= linesX ; i++){
canvas.drawLine(gridding_x * i, 0, gridding_x * i, height, mPaint);
}
for (int i = 1; i <= linesY; i++) {
canvas.drawLine(0, (gridding_y * i ) , width, (gridding_y * i), mPaint);
}
break;
}
}
CaptureModule
{
@Override
public void onResumeAfterSuper() {
// init->onResumeBeforeSuper->onResumeAfterSuper
// this process takes too long at one time,splits the calls several times
// in order to display ui as soon as possible
//---------------------------------------------
mUI.hidePreviewCover();
}
public void restartSession(boolean isSurfaceChanged) {
....
if(isSurfaceChanged) {
mUI.hideSurfaceView();
mUI.showSurfaceView();
}
initializeValues();
//------------------------------------------
updatePreviewSize();
.......
}
private void updatePreviewSize() {
int width = mPreviewSize.getWidth();
int height = mPreviewSize.getHeight();
.......
Log.d(TAG, "updatePreviewSize final preview size = " + width + ", " + height);
mPreviewSize = new Size(width, height);
if (mUI != null)
//----------------------------
mUI.setPreviewSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
}
}
}
CaptureUI.java
{
private GridSurfaceView preview_grid_wire;
preview_grid_wire = (GridSurfaceView) mRootView.findViewById(R.id.preview_grid_wire);
private Point mDisplaySize = new Point();
mActivity.getWindowManager().getDefaultDisplay().getRealSize(mDisplaySize);
public boolean setPreviewSize(int newWidth, int newHeight) {
boolean changed = (newWidth != mPreviewWidth) || ( newHeight != mPreviewHeight);
Log.d(TAG, "setPreviewSize " + newHeight + " " + newHeight + ", isSizeChange:" + changed);
if (changed) {
mPreviewWidth = width;
mPreviewHeight = height;
//--------------layout preview-----w/h---------------------
layoutPreview( (float)mPreviewWidth / mPreviewHeight);
}
return changed;
}
public void layoutPreview(float mAspectRatio) {
//1. get Ratio
int destRatio = CameraUtil.determineRatio(mAspectRatio);
float ratio = mAspectRatio;
if (mAspectRatio > 1) {
ratio = 1 / ratio;
}
// determineRatio method: get Ratio size
/** public static int determineRatio(float ratio) {
if (ratio < 1) { ratio = 1 / ratio; }
if (ratio > 1.33f && ratio < 1.34f) {
return RATIO_4_3;
} else if (ratio > 1.77f && ratio < 1.78f) {
return RATIO_16_9;
} else if (ratio > 1.49f && ratio < 1.51f) {
return RATIO_3_2;
} else if (ratio > 0.99f && ratio < 1.01f) {
return RATIO_1_1;
} else if (ratio > 1.99f && ratio < 2.01f) {
return RATIO_18_9;
} else {
return RATIO_UNKNOWN;
}
} **/
//get window w, h
float width = Math.min(mDisplaySize.x, mDisplaySize.y);
float height = Math.max(mDisplaySize.x, mDisplaySize.y);
if (width == 0 || height == 0) return;
//2. config layout param
int scaledTextureWidth, scaledTextureHeight;
if(destRatio == CameraUtil.RATIO_4_3){
scaledTextureWidth = (int)width;
scaledTextureHeight = (int)(width / ratio);
mTopMargin = getResources().getDimensionPixelSize(R.dimen.ratio_3_4_preview_marginTop);
mBottomMargin = getResources().getDimensionPixelSize(R.dimen.ratio_3_4_preview_marginBottom);
}else if(destRatio == CameraUtil.RATIO_16_9){
scaledTextureWidth = (int)width;
scaledTextureHeight = (int)(width / ratio);
mTopMargin = getResources().getDimensionPixelSize(R.dimen.ratio_9_16_preview_marginTop);
mBottomMargin = getResources().getDimensionPixelSize(R.dimen.ratio_9_16_preview_marginBottom);
} else if (destRatio == CameraUtil.RATIO_1_1) {
scaledTextureWidth = (int)width;
scaledTextureHeight = (int)width;
mTopMargin = getResources().getDimensionPixelSize(R.dimen.ratio_1_1_preview_marginTop);
mBottomMargin = .getResources().getDimensionPixelSize(R.dimen.ratio_1_1_preview_marginBottom);
} else {// full
scaledTextureWidth = (int)width;
scaledTextureHeight = (int)height;
mTopMargin = ((int)height - scaledTextureHeight)/2;
mBottomMargin = ((int)height - scaledTextureHeight)/2;
}
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(scaledTextureWidth, scaledTextureHeight);
if(full){
lp = new FrameLayout.LayoutParams(scaledTextureWidth, scaledTextureHeight, Gravity.CENTER);
}
lp.setMargins(0, mTopMargin, 0, mBottomMargin);
hidePreviewCover();
//effect view
mEffectSurfaceView.setLayoutParams(lp);
//render overlay
if(mRenderOverlay!=null) mRenderOverlay.setLayoutParams(lp);
// capture flash view
if(mFlashOverlay!=null) mFlashOverlay.setLayoutParams(lp);
// af ae view
if(mAFAELockView!=null) mAFAELockView.setLayoutParams(lp);
//face view
if(mFaceView!=null) mFaceView.setLayoutParams(lp);
mActivity.getSurfaceViewHelper().setPreviewLayoutParams(lp);
if (mFaceView != null) {
mFaceView.onSurfaceTextureSizeChanged(scaledTextureWidth, scaledTextureHeight);
}
}
public void hidePreviewCover() {
Log.i(TAG,"hidePreviewCover()");
if (preview_grid_wire == null) {
return;
}
/**<string-array name="pref_key_net_wire_suer_entryvalues" translatable="false">
<item>0</item> //off
<item>1</item> //3 X3
<item>2</item> //square
</string-array>**/
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mActivity);
String netWire = prefs.getString(SettingsManager.KEY_NET_WIRE_SUER,"0");
preview_grid_wire.setType(Integer.parseInt(netWire));
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)mSurfaceView.getLayoutParams();
if(CameraUtil.RATIO_16_9 == CameraUtil.determineRatio((float)mPreviewWidth / mPreviewHeight)
&& "2".equals(netWire)){
float width = Math.min(mDisplaySize.x, mDisplaySize.y);
float height = Math.max(mDisplaySize.x, mDisplaySize.y);
int scaledTextureWidth = (int)width;
int scaledTextureHeight = (int)height;
mTopMargin = ((int) height - scaledTextureHeight)/2;
mBottomMargin = ((int) height - scaledTextureHeight)/2;
lp = new FrameLayout.LayoutParams(scaledTextureWidth, scaledTextureHeight, Gravity.CENTER);
}
preview_grid_wire.setLayoutParams(lp);
preview_grid_wire.setVisibility(View.VISIBLE);
}
}