Android仿微信相机的拍照按钮单击拍照,长按录视频。先上效果图。
项目地址:https://github.com/c786909486/PhotoButton2/tree/v1.0
添加依赖
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }dependencies { compile compile 'com.github.c786909486:PhotoButton2:v1.1' }
长按效果分析
判断是否为长按,如果是,则扩大外圆,缩小内圆。由于要扩大外圆,所以在绘制常态的外圆时不可将圆的直径设置为view的宽度或高度。
outRoundPaint.setAntiAlias(true); outRoundPaint.setColor(outCircleColor); if (isLongClick){ canvas.scale(1.2f,1.2f,width/2,height/2); } canvas.drawCircle(width/2,height/2, outRaduis, outRoundPaint);if (isLongClick){ canvas.drawCircle(width/2,height/2, innerRaduis /2.0f, innerRoundPaint); //画外原环 mCPaint.setAntiAlias(true); mCPaint.setColor(progressColor); mCPaint.setStyle(Paint.Style.STROKE); mCPaint.setStrokeWidth(circleWidth/2); RectF rectF = new RectF(0+circleWidth,0+circleWidth,width-circleWidth,height-circleWidth); canvas.drawArc(rectF,startAngle,mSweepAngle,false,mCPaint); }else { canvas.drawCircle(width/2,height/2, innerRaduis, innerRoundPaint); }
然后通过手势识别判断单击、长按、长按抬起。
mDetector = new GestureDetectorCompat(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapConfirmed(MotionEvent e) { //单击 isLongClick = false; if (listener != null) { listener.onClick(TakePhotoButton.this); } return super.onSingleTapConfirmed(e); } @Override public void onLongPress(MotionEvent e) { //长按 isLongClick = true; postInvalidate(); if (listener != null) { listener.onLongClick(TakePhotoButton.this); } } }); mDetector.setIsLongpressEnabled(true); @Override public boolean onTouchEvent(MotionEvent event) { mDetector.onTouchEvent(event); switch(MotionEventCompat.getActionMasked(event)) { case MotionEvent.ACTION_DOWN: isLongClick = false; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (isLongClick) { isLongClick = false; postInvalidate(); if (this.listener != null) { this.listener.onLongClickUp(this); } } break; } return true; }
自定义接口对各个状态进行监听
public interface OnProgressTouchListener { /** * 单击 * @param photoButton */ void onClick(TakePhotoButton photoButton); /** * 长按 * @param photoButton */ void onLongClick(TakePhotoButton photoButton); /** * 长按抬起 * @param photoButton */ void onLongClickUp(TakePhotoButton photoButton); void onFinish(); }
新闻热点
疑难解答