camera 网格线 function

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);
      }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空白的泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值