android:仿微信錄製短視頻的實現

android:仿微信錄製短視頻的實現

一、需求

仿微信短視頻錄製,點擊拍照,長按錄視頻

二、實現代碼

1、RecordVideoActivity

/**

 * Created by yxj on 17/4/17.

 *

 * 錄製視頻的界面

 */

public class RecordVideoActivity extends TitleActivity {

    private JCameraView mJCameraView;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);//沒有標題

        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置全屏

        this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);//設置豎屏

        setContentView(R.layout.record_video);

 

        mJCameraView = (JCameraView) findViewById(R.id.cameraView);

        mJCameraView.setActivity(this);

        //設置視頻保存路徑(如果不設置默認爲Environment.getExternalStorageDirectory().getPath())

        mJCameraView.setAutoFocus(false);//        mJCameraView.setSaveVideoPath(Environment.getExternalStorageDirectory().getPath());

        mJCameraView.setCameraViewListener(new JCameraView.CameraViewListener() {

            @Override

            public void quit() {

                RecordVideoActivity.this.finish();

            }

 

            @Override

            public void captureSuccess(Bitmap bitmap) {//拍照成功

                String url = FileUtil.saveBitmapToSDCard(bitmap);//拍照保存路徑

                Intent intent = new Intent();

                //把返回數據存入Intent 0是照片,1是視頻

                intent.putExtra("url", url);

                intent.putExtra("type", 0);

                //設置返回數據

                setResult(RESULT_OK, intent);

                finish();

            }

 

            @Override

            public void recordSuccess(String url) {//錄視頻成功

                Intent intent = new Intent();

                //把返回數據存入Intent 0是照片,1是視頻

                intent.putExtra("url", url);

                intent.putExtra("type", 1);

                //設置返回數據

                setResult(RESULT_OK, intent);

                finish();

            }

        });

    }

 

    @Override

    protected void onResume() {

        if (Build.VERSION.SDK_INT < 23) {

            if (!PermissionUtils.PermissionToolBefore23()){

                AlertDialog.Builder builder = new AlertDialog.Builder(this);

                builder.setTitle("提示")

                        .setMessage("沒有照相機權限,請賦予本權限再開始拍照吧~").setPositiveButton("確定", new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface arg0, int arg1) {

                        finish();

                    }

                }).show();

                return;

            }

        }

        mJCameraView.onResume();

        super.onResume();

    }

 

    @Override

    protected void onPause() {

        mJCameraView.onPause();

        super.onPause();

    }

 

    public PermissionUtils.PermissionGrant mPermissionGrant = new PermissionUtils.PermissionGrant() {

        @Override

        public void onPermissionGranted(int requestCode) {

            switch (requestCode) {

                case PermissionUtils.CODE_CAMERA:

                    PermissionUtils.requestPermission(RecordVideoActivity.this, PermissionUtils.CODE_RECORD_AUDIO,

                            mPermissionGrant, false);

                    break;

                case PermissionUtils.CODE_RECORD_AUDIO:

                    BuriedPointManager.getInstance().savePoint(R.integer.share_create_photograph_click);

                    break;

                default:

                    break;

            }

        }

    };}

2、record_video.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical">

 

    <com.zjelite.commonview.JCameraView

        android:id="@+id/cameraView"

        android:layout_width="match_parent"

        android:layout_height="match_parent"/></LinearLayout>

3、CaptureButton

/**

 * 錄製視頻的按鈕,長按錄製,點擊拍照

 */public class CaptureButton extends View {

    public final String TAG = "CaptureButtom";

 

    private Paint               mPaint;

    private Context             mContext;

    private RecordVideoActivity activity;

    

    private float btn_center_Y;

    private float btn_center_X;

 

    private float btn_inside_radius;

    private float btn_outside_radius;

    //before radius

    private float btn_before_inside_radius;

    private float btn_before_outside_radius;

    //after radius

    private float btn_after_inside_radius;

    private float btn_after_outside_radius;

 

    private float btn_return_length;

    private float btn_return_X;

    private float btn_return_Y;

 

    private float btn_left_X, btn_right_X, btn_result_radius;

 

    //state

    private int STATE_SELECTED;

    private final int STATE_LESSNESS       = 0;     //空閒狀態

    private final int STATE_KEY_DOWN       = 1;

    private final int STATE_CAPTURED       = 2;

    private final int STATE_RECORD         = 3;

    private final int STATE_PICTURE_BROWSE = 4;     //拍照完成後的預覽狀態

    private final int STATE_RECORD_BROWSE  = 5;     //錄像完成後的預覽狀態

    private final int STATE_READYQUIT      = 6;     //退出

    private final int STATE_RECORDED       = 7;

 

    private float key_down_Y;

 

    private RectF rectF;

    private float             progress          = 0;

    private LongPressRunnable longPressRunnable = new LongPressRunnable();

    private RecordRunnable    recordRunnable    = new RecordRunnable();

    private ValueAnimator     record_anim       = ValueAnimator.ofFloat(0, 360);

    private CaptureListener mCaptureListener;

 

    public CaptureButton(Context context) {

        this(context, null);

    }

 

    public CaptureButton(Context context, AttributeSet attrs) {

        this(context, attrs, 0);

    }

 

    public CaptureButton(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        mContext = context;

        mPaint = new Paint();

        mPaint.setAntiAlias(true);

        STATE_SELECTED = STATE_LESSNESS;

    }

 

    public void setActivity(RecordVideoActivity activity) {

        this.activity = activity;

    }

 

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//        int widthMode = MeasureSpec.getMode(widthMeasureSpec);

        int widthSize = MeasureSpec.getSize(widthMeasureSpec);//        int heightMode = MeasureSpec.getMode(heightMeasureSpec);//        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        int width = widthSize;

        Log.i(TAG, "measureWidth = " + width);

        int height = (width / 9) * 4;

        setMeasuredDimension(width, height);

    }

 

    @Override

    protected void onSizeChanged(int w, int h, int oldw, int oldh) {

        super.onSizeChanged(w, h, oldw, oldh);

 

        btn_center_X = getWidth() / 2f;

        btn_center_Y = getHeight() / 2f;

 

        btn_outside_radius = (float) (getWidth() / 9);

        btn_inside_radius = (float) (btn_outside_radius * 0.75);

 

        btn_before_outside_radius = (float) (getWidth() / 9);

        btn_before_inside_radius = (float) (btn_outside_radius * 0.75);

        btn_after_outside_radius = (float) (getWidth() / 6);

        btn_after_inside_radius = (float) (btn_outside_radius * 0.6);

 

        btn_return_length = (float) (btn_outside_radius * 0.35);

        //        btn_result_radius = 80;

        btn_result_radius = (float) (getWidth() / 9);

        btn_left_X = getWidth() / 2;

        btn_right_X = getWidth() / 2;

    }

 

    @Override

    protected void onDraw(Canvas canvas) {

        super.onDraw(canvas);

        if (STATE_SELECTED == STATE_LESSNESS || STATE_SELECTED == STATE_RECORD) {

            //draw capture button

            mPaint.setColor(0xFFEEEEEE);

            canvas.drawCircle(btn_center_X, btn_center_Y, btn_outside_radius, mPaint);

            mPaint.setColor(Color.WHITE);

            canvas.drawCircle(btn_center_X, btn_center_Y, btn_inside_radius, mPaint);

 

            //draw Progress bar

            Paint paintArc = new Paint();

            paintArc.setAntiAlias(true);

            paintArc.setColor(0xFF00CC00);

            paintArc.setStyle(Paint.Style.STROKE);

            paintArc.setStrokeWidth(10);

 

            rectF = new RectF(btn_center_X - (btn_after_outside_radius - 5), btn_center_Y - (btn_after_outside_radius

                    - 5), btn_center_X + (btn_after_outside_radius - 5), btn_center_Y + (btn_after_outside_radius - 5));

            canvas.drawArc(rectF, -90, progress, false, paintArc);

 

            //draw return button

            Paint paint = new Paint();

            paint.setAntiAlias(true);

            paint.setColor(Color.WHITE);

            paint.setStyle(Paint.Style.STROKE);

            paint.setStrokeWidth(4);

            Path path = new Path();

 

            btn_return_X = ((getWidth() / 2) - btn_outside_radius) / 2;

            btn_return_Y = (getHeight() / 2 + 10);

 

            path.moveTo(btn_return_X - btn_return_length, btn_return_Y - btn_return_length);

            path.lineTo(btn_return_X, btn_return_Y);

            path.lineTo(btn_return_X + btn_return_length, btn_return_Y - btn_return_length);

            canvas.drawPath(path, paint);

        } else if (STATE_SELECTED == STATE_RECORD_BROWSE || STATE_SELECTED == STATE_PICTURE_BROWSE) {

 

            mPaint.setColor(0xFFEEEEEE);

            canvas.drawCircle(btn_left_X, btn_center_Y, btn_result_radius, mPaint);

            mPaint.setColor(Color.WHITE);

            canvas.drawCircle(btn_right_X, btn_center_Y, btn_result_radius, mPaint);

 

            //left button

            Paint paint = new Paint();

            paint.setAntiAlias(true);

            paint.setColor(Color.BLACK);

            paint.setStyle(Paint.Style.STROKE);

            paint.setStrokeWidth(3);

            Path path = new Path();

 

            path.moveTo(btn_left_X - 2, btn_center_Y + 14);

            path.lineTo(btn_left_X + 14, btn_center_Y + 14);

            path.arcTo(new RectF(btn_left_X, btn_center_Y - 14, btn_left_X + 28, btn_center_Y + 14), 90, -180);

            path.lineTo(btn_left_X - 14, btn_center_Y - 14);

            canvas.drawPath(path, paint);

 

            paint.setStyle(Paint.Style.FILL);

            path.reset();

            path.moveTo(btn_left_X - 14, btn_center_Y - 22);

            path.lineTo(btn_left_X - 14, btn_center_Y - 6);

            path.lineTo(btn_left_X - 23, btn_center_Y - 14);

            path.close();

            canvas.drawPath(path, paint);

 

            paint.setStyle(Paint.Style.STROKE);

            paint.setColor(0xFF00CC00);

            paint.setStrokeWidth(4);

            path.reset();

            path.moveTo(btn_right_X - 28, btn_center_Y);

            path.lineTo(btn_right_X - 8, btn_center_Y + 22);

            path.lineTo(btn_right_X + 30, btn_center_Y - 20);

            path.lineTo(btn_right_X - 8, btn_center_Y + 18);

            path.close();

            canvas.drawPath(path, paint);

        }

    }

 

    @Override

    public boolean onTouchEvent(MotionEvent event) {//        try {

            switch (event.getAction()) {

                case MotionEvent.ACTION_DOWN:

                    if (STATE_SELECTED == STATE_LESSNESS) {

                        if (event.getY() > btn_return_Y - 37 && event.getY() < btn_return_Y + 10 && event.getX() > 

                                btn_return_X - 37 && event.getX() < btn_return_X + 37) {

                            STATE_SELECTED = STATE_READYQUIT;

                        } else if (event.getY() > btn_center_Y - btn_outside_radius && event.getY() < btn_center_Y + 

                                btn_outside_radius && event.getX() > btn_center_X - btn_outside_radius && event.getX

                                () < btn_center_X + btn_outside_radius && event.getPointerCount() == 1) {

                            key_down_Y = event.getY();

                            STATE_SELECTED = STATE_KEY_DOWN;

                            postCheckForLongTouch();

                        }

                    } else if (STATE_SELECTED == STATE_RECORD_BROWSE || STATE_SELECTED == STATE_PICTURE_BROWSE) {

                        if (event.getY() > btn_center_Y - btn_result_radius && event.getY() < btn_center_Y + 

                                btn_result_radius && event.getX() > btn_left_X - btn_result_radius && event.getX() < 

                                btn_left_X + btn_result_radius && event.getPointerCount() == 1) {

                            if (mCaptureListener != null) {

                                if (STATE_SELECTED == STATE_RECORD_BROWSE) {

                                    mCaptureListener.deleteRecordResult();

                                } else if (STATE_SELECTED == STATE_PICTURE_BROWSE) {

                                    mCaptureListener.cancel();

                                }

                            }

                            STATE_SELECTED = STATE_LESSNESS;

                            btn_left_X = btn_center_X;

                            btn_right_X = btn_center_X;

                            invalidate();

                        } else if (event.getY() > btn_center_Y - btn_result_radius && event.getY() < btn_center_Y + 

                                btn_result_radius && event.getX() > btn_right_X - btn_result_radius && event.getX() <

                                btn_right_X + btn_result_radius && event.getPointerCount() == 1) {

                            if (mCaptureListener != null) {

                                if (STATE_SELECTED == STATE_RECORD_BROWSE) {

                                    mCaptureListener.getRecordResult();

                                } else if (STATE_SELECTED == STATE_PICTURE_BROWSE) {

                                    mCaptureListener.determine();

                                }

                            }

                            STATE_SELECTED = STATE_LESSNESS;

                            btn_left_X = btn_center_X;

                            btn_right_X = btn_center_X;

                            invalidate();

                        }

                    }

                    break;

                case MotionEvent.ACTION_MOVE:

                    //                    if (event.getY() > btn_center_Y - btn_outside_radius &&

                    //                            event.getY() < btn_center_Y + btn_outside_radius &&

                    //                            event.getX() > btn_center_X - btn_outside_radius &&

                    //                            event.getX() < btn_center_X + btn_outside_radius) {

                    //                    }

                    //                    if (mCaptureListener != null) {

                    //                        mCaptureListener.scale(key_down_Y - event.getY());

                    //                    }

                    break;

                case MotionEvent.ACTION_UP:

                    removeCallbacks(longPressRunnable);

                    if (STATE_SELECTED == STATE_READYQUIT) {

                        if (event.getY() > btn_return_Y - 37 && event.getY() < btn_return_Y + 10 && event.getX() > 

                                btn_return_X - 37 && event.getX() < btn_return_X + 37) {

                            STATE_SELECTED = STATE_LESSNESS;

                            if (mCaptureListener != null) {    // 錄製完成不使用直接返回鍵時,這個監聽器null了,導致再次點擊下箭頭無法返回

                                mCaptureListener.quit();

                            }

                        }

                    } else if (STATE_SELECTED == STATE_KEY_DOWN) {

                        if (event.getY() > btn_center_Y - btn_outside_radius && event.getY() < btn_center_Y + 

                                btn_outside_radius && event.getX() > btn_center_X - btn_outside_radius && event.getX

                                () < btn_center_X + btn_outside_radius) {

                            if (mCaptureListener != null) {

                                mCaptureListener.capture();

                            }

                            STATE_SELECTED = STATE_PICTURE_BROWSE;

                        }

                    } else if (STATE_SELECTED == STATE_RECORD) {

                        LogUtils.e("CaptureButton", "record_anim.getCurrentPlayTime==" + record_anim

                                .getCurrentPlayTime());

                        if (record_anim.getCurrentPlayTime() < 800) {

                            ToastUtil.toastShort("視頻過短,請重新錄製");

                            STATE_SELECTED = STATE_LESSNESS;

                            //                        Toast.makeText(mContext, "Under time", Toast.LENGTH_SHORT).show();

                            progress = 0;

                            invalidate();

                            record_anim.cancel();

                            if (mCaptureListener != null) {

                                mCaptureListener.cancel();

                            }

                        } else {

                            STATE_SELECTED = STATE_RECORD_BROWSE;

                            removeCallbacks(recordRunnable);

                            //                        Toast.makeText(mContext, "Time length " + record_anim

                            // .getCurrentPlayTime(), Toast.LENGTH_SHORT).show();

                            captureAnimation(getWidth() / 5, (getWidth() / 5) * 4);

                            record_anim.cancel();

                            progress = 0;

                            invalidate();

                            if (mCaptureListener != null) {

                                mCaptureListener.recordEnd();

                            }

                        }

                        if (btn_outside_radius == btn_after_outside_radius && btn_inside_radius == 

                                btn_after_inside_radius) {

                            //                            startAnimation(btn_outside_radius, btn_outside_radius - 40,

                            // btn_inside_radius, btn_inside_radius + 20);

                            startAnimation(btn_after_outside_radius, btn_before_outside_radius, 

                                    btn_after_inside_radius, btn_before_inside_radius);

                        } else {

                            startAnimation(btn_after_outside_radius, btn_before_outside_radius, 

                                    btn_after_inside_radius, btn_before_inside_radius);

                        }

                    }

                    break;

                default:

                    break;

            }//        } catch (Exception e) {//            return false;//        }

        return true;

    }

 

    public void initButton() {

        STATE_SELECTED = STATE_LESSNESS;

        invalidate();

    }

 

    public void captureSuccess() {

        captureAnimation(getWidth() / 5, (getWidth() / 5) * 4);

    }

 

    private void postCheckForLongTouch() {

        postDelayed(longPressRunnable, 200);

    }

 

    private class LongPressRunnable implements Runnable {

        @Override

        public void run() {

            startAnimation(btn_before_outside_radius, btn_after_outside_radius, btn_before_inside_radius, 

                    btn_after_inside_radius);

            STATE_SELECTED = STATE_RECORD;

        }

    }

 

    private class RecordRunnable implements Runnable {

        @Override

        public void run() {

            if (mCaptureListener != null) {

                mCaptureListener.record();

            }

            record_anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

                @Override

                public void onAnimationUpdate(ValueAnimator animation) {

                    if (STATE_SELECTED == STATE_RECORD) {

                        progress = (float) animation.getAnimatedValue();

                    }

                    invalidate();

                }

            });

            record_anim.addListener(new AnimatorListenerAdapter() {

                @Override

                public void onAnimationEnd(Animator animation) {

                    super.onAnimationEnd(animation);

                    if (STATE_SELECTED == STATE_RECORD) {

                        STATE_SELECTED = STATE_RECORD_BROWSE;

                        progress = 0;

                        invalidate();

                        captureAnimation(getWidth() / 5, (getWidth() / 5) * 4);

                        if (btn_outside_radius == btn_after_outside_radius && btn_inside_radius == 

                                btn_after_inside_radius) {

                            startAnimation(btn_after_outside_radius, btn_before_outside_radius, 

                                    btn_after_inside_radius, btn_before_inside_radius);

                        } else {

                            startAnimation(btn_after_outside_radius, btn_before_outside_radius, 

                                    btn_after_inside_radius, btn_before_inside_radius);

                        }

                        if (mCaptureListener != null) {

                            mCaptureListener.recordEnd();

                        }

                    }

                }

            });

            record_anim.setInterpolator(new LinearInterpolator());

            record_anim.setDuration(10000);

            record_anim.start();

        }

    }

 

    private void startAnimation(float outside_start, float outside_end, float inside_start, float inside_end) {

 

        ValueAnimator outside_anim = ValueAnimator.ofFloat(outside_start, outside_end);

        ValueAnimator inside_anim = ValueAnimator.ofFloat(inside_start, inside_end);

        outside_anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override

            public void onAnimationUpdate(ValueAnimator animation) {

                btn_outside_radius = (float) animation.getAnimatedValue();

                invalidate();

            }

        });

        outside_anim.addListener(new AnimatorListenerAdapter() {

            @Override

            public void onAnimationEnd(Animator animation) {

                super.onAnimationEnd(animation);

                if (STATE_SELECTED == STATE_RECORD) {

                    postDelayed(recordRunnable, 100);

                }

            }

        });

        inside_anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override

            public void onAnimationUpdate(ValueAnimator animation) {

                btn_inside_radius = (float) animation.getAnimatedValue();

                invalidate();

            }

        });

        outside_anim.setDuration(100);

        inside_anim.setDuration(100);

        outside_anim.start();

        inside_anim.start();

    }

 

    private void captureAnimation(float left, float right) {

        //        Toast.makeText(mContext,left+ " = "+right,Toast.LENGTH_SHORT).show();

        ValueAnimator left_anim = ValueAnimator.ofFloat(btn_left_X, left);

        ValueAnimator right_anim = ValueAnimator.ofFloat(btn_right_X, right);

        left_anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override

            public void onAnimationUpdate(ValueAnimator animation) {

                btn_left_X = (float) animation.getAnimatedValue();

                invalidate();

            }

 

        });

        right_anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override

            public void onAnimationUpdate(ValueAnimator animation) {

                btn_right_X = (float) animation.getAnimatedValue();

                invalidate();

            }

        });

        left_anim.setDuration(200);

        right_anim.setDuration(200);

        left_anim.start();

        right_anim.start();

    }

 

    public void setCaptureListener(CaptureListener mCaptureListener) {

        this.mCaptureListener = mCaptureListener;

    }

 

    public interface CaptureListener {

        void capture();

 

        void cancel();//拍照點擊返回

 

        void determine();//拍照的確定

 

        void quit();//關閉界面

 

        void record();

 

        void recordEnd();

 

        void getRecordResult();//錄像點擊確定

 

        void deleteRecordResult();//錄像點擊返回

 

        void scale(float scaleValue);

    }}

4、JCwebView

/**

 * Created by yxj on 17/4/17.

 * 錄製視頻的自定義控件

 */

public class JCameraView extends RelativeLayout implements SurfaceHolder.Callback, Camera.AutoFocusCallback,

        CameraFocusListener {

 

    private Context             mContext;

    private VideoView           mVideoView;

    private FocusView           mFocusView;     //對焦的按鈕

    private CaptureButton       mCaptureButton; //錄製視頻/拍照的按鈕

    private ImageView           mImageView;     //右上角攝像頭切換的圖標

    private ImageView           picPreImageView;//拍照完成的預覽的圖片

    private float               screenProp;

    private MediaRecorder       mediaRecorder;

    private Camera              mCamera;

    private Camera.Parameters   mParam;

    private int                 previewWidth;

    private int                 previewHeight;

    private int                 pictureWidth;

    private int                 pictureHeight;

    private boolean             autoFocus;

    private String              fileName;

    private Bitmap              pictureBitmap;

    private CameraViewListener  cameraViewListener;

    private RecordVideoActivity activity;

    private boolean             needSetVisible;

 

    public final String                TAG                   = "JCameraView";

    private      PowerManager          powerManager          = null;

    private      PowerManager.WakeLock wakeLock              = null;

    private      int                   iconMargin            = 0;

    private      int                   iconSrc               = 0;

    private      SurfaceHolder         mHolder               = null;

    private      String                videoFileName         = "";

    private      boolean               isPlay                = false;

    private      boolean               isRecorder            = false;

    private      boolean               isPre                 = false;//是不是在拍照的預覽

    private      int                   SELECTED_CAMERA       = -1;

    private      int                   CAMERA_POST_POSITION  = -1;

    private      int                   CAMERA_FRONT_POSITION = -1;

 

 

    public void setCameraViewListener(CameraViewListener cameraViewListener) {

        this.cameraViewListener = cameraViewListener;

    }

 

    public JCameraView(Context context) {

        this(context, null);

    }

 

    public JCameraView(Context context, AttributeSet attrs) {

        this(context, attrs, 0);

    }

 

    public JCameraView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

        mContext = context;

        powerManager = (PowerManager) mContext.getSystemService(mContext.POWER_SERVICE);

        wakeLock = this.powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Lock");

        findAvailableCameras();

        SELECTED_CAMERA = CAMERA_POST_POSITION;

 

        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.JCameraView, defStyleAttr, 0);

        iconMargin = a.getDimensionPixelSize(R.styleable.JCameraView_iconMargin, (int) TypedValue.applyDimension

                (TypedValue.COMPLEX_UNIT_SP, 15, getResources().getDisplayMetrics()));

        iconSrc = a.getResourceId(R.styleable.JCameraView_iconSrc, R.drawable.capture);

 

        initView();

    }

 

    public void setActivity(RecordVideoActivity activity) {

        this.activity = activity;

        mCaptureButton.setActivity(activity);

    }

 

    /**

     * 初始化View界面,含控件的初始化以及控件監聽器的初始化

     */

    private void initView() {

        setWillNotDraw(false);

        this.setBackgroundColor(Color.BLACK);

 

        initVideoView();            //視頻播放控件

        initPicPreImageView();      //預覽

        initCaptureButton();        //錄像按鈕

        initCameraChangeButton();   //切換攝像頭

        initFocusView();            //對焦視圖

        initSurfaceHolder();

    }

 

    private void initSurfaceHolder() {

        mHolder = mVideoView.getHolder();

        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        mHolder.addCallback(this);

    }

 

    private void initFocusView() {

        //        對焦的圖標

        mFocusView = new FocusView(mContext, 120);

        mFocusView.setVisibility(INVISIBLE);

 

        this.addView(mFocusView);       //對焦

    }

 

    private void initCameraChangeButton() {

        //右上角切換攝像頭的按鈕       

        mImageView = new ImageView(mContext);

        LayoutParams imageViewParam = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        imageViewParam.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);

        imageViewParam.setMargins(0, iconMargin, iconMargin, 0);

        mImageView.setLayoutParams(imageViewParam);

        mImageView.setImageResource(iconSrc);

        mImageView.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                if (!isRecorder && mCamera != null) {

                    releaseCamera();

 

                    //切換攝像頭

                    SELECTED_CAMERA = SELECTED_CAMERA == CAMERA_POST_POSITION ? CAMERA_FRONT_POSITION :

                            CAMERA_POST_POSITION;

 

                    getCamera(SELECTED_CAMERA);

                    previewWidth = previewHeight = 0;

                    pictureWidth = pictureHeight = 0;

                    setStartPreview(mCamera, mHolder);

                }

            }

        });

 

        this.addView(mImageView);       //右上角攝像頭切換

    }

 

    private void initCaptureButton() {

        //底部居中的錄像/拍照按鈕

        LayoutParams btnParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

        btnParams.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);

        btnParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);

        mCaptureButton = new CaptureButton(mContext);

        mCaptureButton.setLayoutParams(btnParams);

 

        //初始化爲自動對焦

        autoFocus = true;

        initCaptureButtonListener();

 

        this.addView(mCaptureButton);   //錄視頻

    }

 

    private void initPicPreImageView() {

        LayoutParams picPreImageViewParam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

        picPreImageViewParam.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);

        picPreImageView = new ImageView(mContext);

        picPreImageView.setLayoutParams(picPreImageViewParam);

        picPreImageView.setVisibility(INVISIBLE);

 

        this.addView(picPreImageView);  //預覽

    }

 

    private void initVideoView() {

    /*VideoView 播放視頻的界面*/

        mVideoView = new VideoView(mContext);

        LayoutParams videoViewParam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

        videoViewParam.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);

        mVideoView.setLayoutParams(videoViewParam);

        this.addView(mVideoView);       //viedoView

 

        mVideoView.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View v) {

                mCamera.autoFocus(JCameraView.this);

            }

        });

    }

 

    /**

     * 初始化拍照/錄像按鈕的監聽器

     */

    private void initCaptureButtonListener() {

        mCaptureButton.setCaptureListener(new CaptureButton.CaptureListener() {

            @Override

            public void capture() {

                JCameraView.this.capture();

            }

 

            @Override

            public void cancel() {

                isRecorder = false;

                releaseCamera();

                getCamera(SELECTED_CAMERA);

                isPre = false;

                setStartPreview(mCamera, mHolder);

                picPreImageView.setVisibility(INVISIBLE);

            }

 

            @Override

            public void determine() {

                if (cameraViewListener != null) {

                    cameraViewListener.captureSuccess(pictureBitmap);

                }

                releaseCamera();

                isPre = false;

            }

 

            @Override

            public void quit() {

                if (cameraViewListener != null) {

                    cameraViewListener.quit();

                }

            }

 

            @Override

            public void record() {

                startRecord();

            }

 

            @Override

            public void recordEnd() {

                stopRecord();

            }

 

            @Override

            public void getRecordResult() {

                if (cameraViewListener != null) {

                    cameraViewListener.recordSuccess(fileName);

                }

                mVideoView.stopPlayback();

                releaseCamera();

                isPlay = false;

            }

 

            @Override

            public void deleteRecordResult() {

                File file = new File(fileName);

                if (file.exists()) {

                    file.delete();

                }

                fileName = null;

                releaseCamera();

 

                mVideoView.pause();

                mVideoView.stopPlayback();  //整個界面銷燬,各種按鈕不存在了,依附於按鈕的監聽器也就不存在了

 

                isPlay = false;

                getCamera(SELECTED_CAMERA);

                setStartPreview(mCamera, mHolder);

            }

 

            @Override

            public void scale(float scaleValue) {

                if (scaleValue >= 0) {

                    int scaleRate = (int) (scaleValue / 50);

 

                    if (scaleRate < 10 && scaleRate >= 0 && mParam != null && mCamera != null && mParam

                            .isSmoothZoomSupported()) {

                        mParam = mCamera.getParameters();

                        mParam.setZoom(scaleRate);

                        mCamera.setParameters(mParam);

                    }

                }

            }

        });

    }

 

    @Override

    protected void onLayout(boolean changed, int l, int t, int r, int b) {

        super.onLayout(changed, l, t, r, b);

    }

 

    //獲取Camera

    private void getCamera(int position) {

        try {

            if (null == mCamera) {

                Log.d(JCameraView.class.getName(), "position:" + position);

                mCamera = Camera.open(position);

                LogUtils.d("guo_zjin:", "create camera success");

            }

        } catch (RuntimeException e) {

            LogUtils.d("guo_zjin:", "create camera Runtime Exception");

            AlertDialog.Builder builder = new AlertDialog.Builder(activity);

            builder.setTitle("提示").setMessage("沒有照相機權限,請賦予本權限再開始拍照吧~").setPositiveButton("確定", new DialogInterface

                    .OnClickListener() {

                @Override

                public void onClick(DialogInterface arg0, int arg1) {

                    activity.finish();

                }

            }).show();

        } catch (Exception e) {

            LogUtils.d("guo_zjin:", "create camera Exception");

            mCamera = null;

            e.printStackTrace();

        }

    }

 

    private void setStartPreview(Camera camera, SurfaceHolder holder) {

        if (camera == null) {

            return;

        }

        if (mImageView.getVisibility() != View.VISIBLE && !isPre && !isPlay && !isRecorder) {

            mImageView.setVisibility(View.VISIBLE);

            this.removeView(mImageView);

            this.addView(mImageView);

        }

        this.invalidate();

 

        mParam = camera.getParameters();

 

        if (screenProp != 0) {

            Camera.Size previewSize = CameraParamUtil.getInstance().getPreviewSize(mParam.getSupportedPreviewSizes(),

                    1000, screenProp);

            Camera.Size pictureSize = CameraParamUtil.getInstance().getPictureSize(mParam.getSupportedPictureSizes(),

                    1200, screenProp);

            mParam.setPreviewSize(previewSize.width, previewSize.height);

            mParam.setPictureSize(pictureSize.width, pictureSize.height);

        }

        if (CameraParamUtil.getInstance().isSupportedFocusMode(mParam.getSupportedFocusModes(), Camera.Parameters

                .FOCUS_MODE_CONTINUOUS_VIDEO)) {

            mParam.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

        } else if (CameraParamUtil.getInstance().isSupportedFocusMode(mParam.getSupportedFocusModes(), Camera

                .Parameters.FOCUS_MODE_AUTO)) {

            mParam.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

        }

        if (CameraParamUtil.getInstance().isSupportedPictureFormats(mParam.getSupportedPictureFormats(), ImageFormat

                .JPEG)) {

            mParam.setPictureFormat(ImageFormat.JPEG);

            mParam.setJpegQuality(100);

        }

        camera.setParameters(mParam);

        try {

            LogUtils.d("guo_zjin:", "發生錯誤的開始。。。。");

            camera.setPreviewDisplay(holder);

            LogUtils.d("guo_zjin:", "發生錯誤的開始。。。。01");

            camera.setDisplayOrientation(CameraParamUtil.getInstance().setCameraDisplayOrientation(activity,

                    SELECTED_CAMERA));

            LogUtils.d("guo_zjin:", "發生錯誤的開始。。。。02");

 

            camera.startPreview();

            LogUtils.d("guo_zjin:", "發生錯誤的開始。。。。03");

        } catch (FileNotFoundException e) {

            LogUtils.d("guo_zjin:", "在setStartPreview裏發生文件不存在,被release");

            releasePre();

        } catch (IOException e) {

            LogUtils.d("guo_zjin: ", "在這裏發生了一個該死的異常,但是我不得不在這裏處理掉。。。。。00" + e.getMessage());

        } catch (Exception e) {

            LogUtils.d("guo_zjin:", "在這裏發生了一個該死的異常,但是我不得不在這裏處理掉。。。。。01" + e.getMessage());

        }

    }

 

    private void releaseMediaRecorder() {

        if (mVideoView != null) {

            mVideoView.stopPlayback();

            mHolder = mVideoView.getHolder();

        }

        if (mediaRecorder != null) {

            mediaRecorder.reset();   // clear recorder configuration

            mediaRecorder.release(); // release the recorder object

            mediaRecorder = null;

            mCamera.lock();           // lock camera for later use

        }

    }

 

    private void releaseCamera() {

        LogUtils.d("guo_zjin: ", "release Camera here.......");

        if (mCamera != null) {

            mCamera.stopPreview();

            try {

                mCamera.setPreviewDisplay(null);

            } catch (IOException e) {

                e.printStackTrace();

            }

            mCamera.setPreviewCallback(null);

            mCamera.release();

            mCamera = null;

        }

    }

 

    public void capture() {

        if (autoFocus) {

            mCamera.autoFocus(this);

        } else {

            isPre = true;

            if (SELECTED_CAMERA == CAMERA_POST_POSITION) {

                mCamera.takePicture(null, null, new Camera.PictureCallback() {

                    @Override

                    public void onPictureTaken(byte[] data, Camera camera) {

                        mCamera.stopPreview();

                        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

                        Matrix matrix = new Matrix();

                        matrix.setRotate(90);

                        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

                        pictureBitmap = bitmap;

                        mImageView.setVisibility(INVISIBLE);

                        mCaptureButton.captureSuccess();

                        picPreImageView.setVisibility(VISIBLE);

                        picPreImageView.setImageBitmap(pictureBitmap);

                    }

                });

            } else if (SELECTED_CAMERA == CAMERA_FRONT_POSITION) {

                mCamera.takePicture(null, null, new Camera.PictureCallback() {

                    @Override

                    public void onPictureTaken(byte[] data, Camera camera) {

                        mCamera.stopPreview();

                        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

                        Matrix matrix = new Matrix();

                        matrix.setRotate(270);

                        matrix.postScale(-1, 1);

                        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

                        pictureBitmap = bitmap;

                        mImageView.setVisibility(INVISIBLE);

                        mCaptureButton.captureSuccess();

                        picPreImageView.setVisibility(VISIBLE);

                        picPreImageView.setImageBitmap(pictureBitmap);

                    }

                });

            }

        }

    }

 

    //自動對焦

    @Override

    public void onAutoFocus(boolean success, Camera camera) {

        if (autoFocus) {

            isPre = true;

            if (SELECTED_CAMERA == CAMERA_POST_POSITION && success) {

                mCamera.takePicture(null, null, new Camera.PictureCallback() {

                    @Override

                    public void onPictureTaken(byte[] data, Camera camera) {

                        mCamera.stopPreview();

                        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

                        Matrix matrix = new Matrix();

                        matrix.setRotate(90);

                        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

                        pictureBitmap = bitmap;

                        mImageView.setVisibility(INVISIBLE);

                        mCaptureButton.captureSuccess();

                        picPreImageView.setVisibility(VISIBLE);

                        picPreImageView.setImageBitmap(pictureBitmap);

                    }

                });

            } else if (SELECTED_CAMERA == CAMERA_FRONT_POSITION) {

                mCamera.takePicture(null, null, new Camera.PictureCallback() {

                    @Override

                    public void onPictureTaken(byte[] data, Camera camera) {

                        mCamera.stopPreview();

                        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);

                        Matrix matrix = new Matrix();

                        matrix.setRotate(270);

                        matrix.postScale(-1, 1);

                        bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

                        pictureBitmap = bitmap;

                        mImageView.setVisibility(INVISIBLE);

                        mCaptureButton.captureSuccess();

                        picPreImageView.setVisibility(VISIBLE);

                        picPreImageView.setImageBitmap(pictureBitmap);

                    }

                });

            }

        }

    }

 

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        float widthSize = MeasureSpec.getSize(widthMeasureSpec);

        float heightSize = MeasureSpec.getSize(heightMeasureSpec);

        screenProp = heightSize / widthSize;

    }

 

    //    @Override

    //    public void surfaceCreated(SurfaceHolder holder) {

    //        LogUtils.d("拍攝視頻", "surfaceCreated");

    //        setStartPreview(mCamera, holder);

    //        mHolder = holder;

    //        LogUtils.d("guo_zjin:surfaceCreated ", mHolder.getSurface().hashCode() + "");

    //    }

    @Override

    public void surfaceCreated(SurfaceHolder holder) {

        try {

            if (mCamera != null) {

                mCamera.setPreviewDisplay(holder);

                mHolder = holder;

            }

            LogUtils.d("guo_zjin:surfaceCreated ", mHolder.getSurface().hashCode() + "");

        } catch (IOException exception) {

            Log.e(TAG, "IOException caused by setPreviewDisplay()", exception);

        }

    }

 

    @Override

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        LogUtils.d("拍攝視頻", "surfaceChanged");

        if (mHolder.getSurface() == null) {

            return;

        }

        mHolder = holder;

        // stop preview before making changes

        try {

            LogUtils.d("guo_zjin:surfaceChanged before stopPreview ", mHolder.hashCode() + "");

 

            if (null == mCamera) {

                getCamera(SELECTED_CAMERA);

            }

            mCamera.stopPreview();

            LogUtils.d("guo_zjin:surfaceChanged ", mHolder.hashCode() + "");

            setStartPreview(mCamera, holder);

        } catch (Exception e) {

            LogUtils.d("guo_zjin:", "surfaceChanged Exception " + e.getMessage());

            Log.d(TAG, "Error starting camera preview: " + e.getMessage());

        }

    }

 

    @Override

    public void surfaceDestroyed(SurfaceHolder holder) {

        releaseCamera();

    }

 

    public void onResume() {

        SystemClock.sleep(500);

        if (mCamera == null) {

            getCamera(SELECTED_CAMERA);

            if (needSetVisible && mVideoView != null) {

                mVideoView.setVisibility(View.VISIBLE);

            } else {

                needSetVisible = true;

            }

            if (mHolder != null && !isPre) {

                setStartPreview(mCamera, mHolder);

            }

        }

        wakeLock.acquire();

    }

 

    public void onPause() {

        if (wakeLock.isHeld()) {

            wakeLock.release();

        }

        releaseMediaRecorder();

        releaseCamera();

        if (needSetVisible && mVideoView != null) {

            mVideoView.setVisibility(View.INVISIBLE);

        }

    }

 

    private void startRecord() {

        if (isRecorder) {

            mediaRecorder.stop();

            mediaRecorder.release();

            mediaRecorder = null;

        }

        if (mCamera == null) {

            stopRecord();

            return;

        }

        mCamera.unlock();

        if (mediaRecorder == null) {

            mediaRecorder = new MediaRecorder();

        }

        mediaRecorder.reset();

        mediaRecorder.setCamera(mCamera);

        mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

 

        if (android.os.Build.MODEL.contains("vivo X5Pro")) {

            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

        } else {

            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);

        }

        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

        //在1加手機上,如果設置15,直接掛掉,好像是能接受的最大值是30,所以屏蔽掉

        //        mediaRecorder.setVideoFrameRate(15);//幀率

 

        if (mParam == null) {

            mParam = mCamera.getParameters();

        }

        Camera.Size videoSize = CameraParamUtil.getInstance().getPictureSize(CameraParamUtil.getSupportedVideoSizes

                (mParam), 1000, screenProp);

 

        mediaRecorder.setVideoSize(videoSize.width, videoSize.height);

        int rotationRecord = CameraParamUtil.getInstance().setCameraDisplayOrientation(activity, SELECTED_CAMERA);

        android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();

        android.hardware.Camera.getCameraInfo(SELECTED_CAMERA, info);

        int frontRotation;

        if (rotationRecord == 180) {

            //反向橫屏的前置角度

            frontRotation = 180;

        } else {

            //豎屏和正向橫屏的前置角度

            //錄製下來的視屏選擇角度,此處爲前置

            frontRotation = (rotationRecord == 0) ? 270 - info.orientation : info.orientation;

        }

        mediaRecorder.setOrientationHint((SELECTED_CAMERA == 1) ? frontRotation : rotationRecord);

        mediaRecorder.setMaxDuration(10000);

        mediaRecorder.setVideoEncodingBitRate(1024 * 1024);

        mediaRecorder.setPreviewDisplay(mHolder.getSurface());

 

        videoFileName = "/myimage/video_" + System.currentTimeMillis() + ".mp4";

        File file = new File(PathUtil.getPathFile(), videoFileName);

        FileUtil.checkFilePath(file, false);

        mediaRecorder.setOutputFile(file.getPath());

        try {

            mediaRecorder.prepare();

            mediaRecorder.start();

            isRecorder = true;

            mImageView.setVisibility(INVISIBLE);

        } catch (IOException e) {

            e.printStackTrace();

        } catch (Exception e) {

            LogUtils.d("錯誤", e.getMessage());

        }

    }

 

    private void stopRecord() {

        if (mediaRecorder != null) {

            mediaRecorder.setOnErrorListener(new MediaRecorder.OnErrorListener() {

                @Override

                public void onError(MediaRecorder mr, int what, int extra) {

                    ToastUtil.toastShort("視頻過短,請重新錄製");

                    if (mr != null) {

                        mr.reset();

                    }

                    mediaRecorder.release();

                    mediaRecorder = null;

                    isRecorder = false;

                    fileName = PathUtil.getPathFile() + videoFileName;

                    File file = new File(fileName);

                    if (file.exists()) {

                        file.delete();

                    }

                    releaseCamera();

                    getCamera(SELECTED_CAMERA);

                    isPlay = false;

                    setStartPreview(mCamera, mHolder);

                    mCaptureButton.initButton();

                }

            });

 

            mediaRecorder.setOnInfoListener(null);

            mediaRecorder.setPreviewDisplay(null);

            try {

                mediaRecorder.stop();

                mediaRecorder.release();

                mediaRecorder = null;

                isRecorder = false;

            } catch (IllegalStateException e) {

                e.printStackTrace();

            }

 

            releaseCamera();

 

            mImageView.setVisibility(INVISIBLE);

 

            fileName = PathUtil.getPathFile() + videoFileName;

            File file = new File(fileName);

            if (file.exists() && file.length() > 0) {

                mVideoView.setVideoPath(fileName);

                mVideoView.start();

 

                mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

                    @Override

                    public void onPrepared(MediaPlayer mp) {

                        isPlay = true;

                        mp.start();

                        mp.setLooping(true);

                    }

                });

                mVideoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

                    @Override

                    public void onCompletion(MediaPlayer mp) {

                        if (fileName != null) {

                            mVideoView.setVideoPath(fileName);

                            mVideoView.start();

                        }

                    }

                });

 

                mVideoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {

                    @Override

                    public boolean onError(MediaPlayer mp, int what, int extra) {

                        LogUtils.d("guo_zjin:", "mVideoView.setOnErrorListener,被release");

                        if (!isPre) {

                            releasePre();

                        }

                        return true;

                    }

                });

            } else {

                ToastUtil.toastShort("視頻不存在,趕緊重拍一個吧~");

                LogUtils.d("guo_zjin:", "stopRecorder,被release");

                releasePre();

            }

        }

    }

 

    //關閉預覽

    private void releasePre() {

        if (mVideoView != null && mVideoView.isPlaying()) {

            mVideoView.stopPlayback();

        }

        if (mHolder != null) {

            mHolder.getSurface().release();

        }

        mCaptureButton.initButton();

        picPreImageView.setVisibility(INVISIBLE);

        // 區分一下是照片還是視頻

        releaseCamera();

        isPre = false;

        isPlay = false;

        getCamera(SELECTED_CAMERA);

        setStartPreview(mCamera, mHolder);

    }

 

    /**

     * 獲得可用的相機,並設置前後攝像機的ID

     */

    private void findAvailableCameras() {

        Camera.CameraInfo info = new Camera.CameraInfo();

        int numCamera = Camera.getNumberOfCameras();

        for (int i = 0; i < numCamera; i++) {

            Camera.getCameraInfo(i, info);

            // 找到了前置攝像頭

            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {

                CAMERA_FRONT_POSITION = info.facing;

            }

            // 找到了後置攝像頭

            if (info.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {

                CAMERA_POST_POSITION = info.facing;

            }

        }

    }

 

    public void setAutoFocus(boolean autoFocus) {

        this.autoFocus = autoFocus;

    }

 

    private int count = 0;

 

    @Override

    public void onFocusBegin(float x, float y) {

        mFocusView.setVisibility(VISIBLE);

        mFocusView.setX(x - mFocusView.getWidth() / 2);

        mFocusView.setY(y - mFocusView.getHeight() / 2);

        mCamera.autoFocus(new Camera.AutoFocusCallback() {

            @Override

            public void onAutoFocus(boolean success, Camera camera) {

                if (!success) {

                    count++;

                    if (count > 3) {

                        mCamera.cancelAutoFocus();

                        onFocusEnd();

                        count = 0;

                    }

                }

                if (success) {

                    mCamera.cancelAutoFocus();

                    onFocusEnd();

                    count = 0;

                }

            }

        });

    }

 

    //手動對焦結束

    @Override

    public void onFocusEnd() {

        mFocusView.setVisibility(INVISIBLE);

    }

 

    public interface CameraViewListener {

        void quit();//關閉界面

 

        void captureSuccess(Bitmap bitmap);

 

        void recordSuccess(String url);

    }

 

    @Override

    public boolean onTouchEvent(final MotionEvent event) {

        if (!autoFocus && event.getAction() == MotionEvent.ACTION_DOWN && SELECTED_CAMERA == CAMERA_POST_POSITION &&

                !isPlay && !isPre) {

            if (mCamera != null) {

                mParam = mCamera.getParameters();

                mParam.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

                mCamera.setParameters(mParam);

            }

            onFocusBegin(event.getX(), event.getY());

        }

        return super.onTouchEvent(event);

    }}

 

"進 https://github.com/CnPeng/LearningNotes 看更多內容..."

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章