android怎么实现简单的矩形裁剪框
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"android怎么实现简单的矩形裁剪框"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"android怎么实现简单的矩形裁剪框"文章能帮助大家解
千家信息网最后更新 2026年10月31日android怎么实现简单的矩形裁剪框
这篇文章主要介绍"android怎么实现简单的矩形裁剪框"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"android怎么实现简单的矩形裁剪框"文章能帮助大家解决问题。
正常模式是这样的
简单的添加了等比例裁剪
贴代码
public class CutView extends View { float downX; float downY; boolean isLeft; boolean isRight; boolean isTop; boolean isBottom; boolean isMove; boolean isSlideLeft; boolean isSlideRight; boolean isSlideTop; boolean isSlideBottom; float rectLeft; float rectRight; float rectTop; float rectBottom; private int measuredWidth; private int measuredHeight; private Paint paint; private int dp3; private int cornerLength; private int dp1; private float aspect = -1; public CutView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public CutView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CutView(Context context) { super(context); init(); } private void init() { dp3 = (int) getResources().getDimension(R.dimen.dp3); dp1 = (int) getResources().getDimension(R.dimen.dp1); paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.WHITE); paint.setStyle(Paint.Style.STROKE); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); downY = event.getY(); if(downX >= rectLeft && downX <= rectRight && downY >= rectTop && downY <= rectBottom){ //判断手指的范围在左面还是右面 int w = (int) ((rectRight - rectLeft)/3); if (downX >= rectLeft && downX <= rectLeft+w) { isLeft = true; } else if (downX <= rectRight && downX >= rectRight - w) { isRight = true; } //判断手指的范围在上面还是下面 int h = (int) ((rectBottom - rectTop)/3); if (downY >= rectTop && downY <= rectTop+h) { isTop = true; } else if (downY <= rectBottom && downY >= rectBottom - h) { isBottom = true; } //如果手指范围没有在任何边界位置, 那么我们就认为用户是想拖拽框体 if (!isLeft && !isTop && !isRight && !isBottom) { isMove = true; } } break; case MotionEvent.ACTION_MOVE: float moveX = event.getX(); float moveY = event.getY(); //得到手指移动距离 float slideX = moveX - downX ; float slideY = moveY - downY; if (isMove) {//判断是否是拖拽模式 rectLeft += slideX; rectRight += slideX; rectTop += slideY; rectBottom += slideY; //同时改变left和right值, 达到左右移动的效果 if (rectLeft < 0 || rectRight > measuredWidth) {//判断x轴的移动边界 rectLeft -= slideX; rectRight -= slideX; } //同时改变top和bottom值, 达到上下移动的效果 if (rectTop < 0 || rectBottom > measuredHeight ) {//判断y轴的移动边界 rectTop -= slideY; rectBottom -= slideY; } //实时触发onDraw()方法 invalidate(); downX = moveX; downY = moveY; } else { if(aspect != -1){ if(isLeft && (isTop || isBottom)){ if(!isSlideLeft && !isSlideTop && !isSlideBottom){ float x = Math.abs(slideX); float y = Math.abs(slideY); if(x > y && x > 10){ isSlideLeft = true; }else if(x < y && y >10){ if(isTop){ isSlideTop = true; }else{ isSlideBottom = true; } } } }else if (isRight && (isTop || isBottom)){ if(!isSlideRight && !isSlideTop && !isSlideBottom){ float x = Math.abs(slideX); float y = Math.abs(slideY); if(x > y && x > 10){ isSlideRight = true; }else if(x < y && y >10){ if(isTop){ isSlideTop = true; }else{ isSlideBottom = true; } } } }else if(isLeft && !isSlideLeft){ isSlideLeft = true; }else if(isRight && !isSlideLeft){ isSlideRight = true; }else if(isTop && !isSlideTop){ isSlideTop = true; }else if(isBottom && !isSlideBottom){ isSlideBottom = true; } if (isSlideLeft) { rectLeft += slideX; if (rectLeft < 0) rectLeft = 0; float w = rectRight - rectLeft; if(w < cornerLength * 2){ w = cornerLength * 2; rectLeft = rectRight - w; } float h = w/aspect; if(h < cornerLength * 2){ h = cornerLength * 2; w = h *aspect; rectLeft = rectRight - w; } if(isTop){ rectBottom = rectTop + h; }else if(isBottom){ rectTop = rectBottom - h; }else{ float rh = rectBottom - rectTop; float t = (rh - h)/2; rectTop += t; rectBottom -= t; } if(rectTop < 0){ rectTop = 0; rectBottom = h; if(rectBottom > measuredHeight){ rectBottom = measuredHeight; } w = rectBottom *aspect; rectLeft = rectRight - w; }else if(rectBottom > measuredHeight){ rectBottom = measuredHeight; rectTop = measuredHeight - h; if(rectTop < 0){ rectTop = 0; } w = (rectBottom - rectTop) *aspect; rectLeft = rectRight - w; } invalidate(); downX = moveX; downY = moveY; } else if (isSlideRight) { rectRight += slideX; if (rectRight > measuredWidth ) rectRight = measuredWidth; float w = rectRight - rectLeft; if(w < cornerLength * 2){ w = cornerLength * 2; rectRight = rectLeft + w; } float h = w/aspect; if(h < cornerLength * 2){ h = cornerLength * 2; w = h *aspect; rectRight = rectLeft + w; } if(isTop){ rectBottom = rectTop + h; }else if(isBottom){ rectTop = rectBottom - h; }else{ float rh = rectBottom - rectTop; float t = (rh - h)/2; rectTop += t; rectBottom -= t; } if(rectTop < 0){ rectTop = 0; rectBottom = h; if(rectBottom > measuredHeight){ rectBottom = measuredHeight; } w = rectBottom *aspect; rectRight = rectLeft + w; }else if(rectBottom > measuredHeight){ rectBottom = measuredHeight; rectTop = measuredHeight - h; if(rectTop < 0){ rectTop = 0; } w = (rectBottom - rectTop) *aspect; rectRight = rectLeft + w; } invalidate(); downX = moveX; downY = moveY; }else if (isSlideTop) { rectTop += slideY; if (rectTop < 0) rectTop = 0; float h = rectBottom - rectTop; if(h < cornerLength * 2){ h = cornerLength * 2; rectTop = rectBottom - h; } float w = h*aspect; if(w < cornerLength * 2){ w = cornerLength * 2; h = w /aspect; rectTop = rectBottom - h; } if(isLeft){ rectRight = rectLeft + w; }else if(isRight){ rectLeft = rectRight - w; }else{ float rw = rectRight - rectLeft; float t = (rw - w)/2; rectLeft += t; rectRight -= t; } if(rectLeft < 0){ rectLeft = 0; rectRight = w; if(rectRight > measuredWidth){ rectRight = measuredWidth; } h = rectRight /aspect; rectTop = rectBottom - h; }else if(rectRight > measuredWidth){ rectRight = measuredWidth; rectLeft = measuredWidth - w; if(rectLeft < 0){ rectLeft = 0; w = measuredWidth; } h = w /aspect; rectTop = rectBottom - h; } invalidate(); downX = moveX; downY = moveY; } else if (isSlideBottom) { rectBottom += slideY; if (rectBottom > measuredHeight ) rectBottom = measuredHeight ; float h = rectBottom - rectTop; if(h < cornerLength * 2){ h = cornerLength * 2; rectBottom = rectTop + h; } float w = h*aspect; if(w < cornerLength * 2){ w = cornerLength * 2; h = w /aspect; rectBottom = rectTop + h; } if(isLeft){ rectRight = rectLeft + w; }else if(isRight){ rectLeft = rectRight - w; }else{ float rw = rectRight - rectLeft; float t = (rw - w)/2; rectLeft += t; rectRight -= t; } if(rectLeft < 0){ rectLeft = 0; rectRight = w; if(rectRight > measuredWidth){ rectRight = measuredWidth; } h = rectRight /aspect; rectBottom = rectTop + h; }else if(rectRight > measuredWidth){ rectRight = measuredWidth; rectLeft = measuredWidth - w; if(rectLeft < 0){ rectLeft = 0; w = measuredWidth; } h = w /aspect; rectBottom = rectTop + h; } invalidate(); downX = moveX; downY = moveY; } }else{ if (isLeft) { rectLeft += slideX; if (rectLeft < 0) rectLeft = 0; if (rectLeft > rectRight - cornerLength * 2) rectLeft = rectRight - cornerLength * 2; } else if (isRight) { rectRight += slideX; if (rectRight > measuredWidth ) rectRight = measuredWidth; if (rectRight < rectLeft + cornerLength * 2) rectRight = rectLeft + cornerLength * 2; } //改变边框的高度, 如果两个都满足(比如手指在边角位置),那么就呈现一种缩放状态 if (isTop) { rectTop += slideY; if (rectTop < 0) rectTop = 0; if (rectTop > rectBottom - cornerLength * 2) rectTop = rectBottom - cornerLength * 2; } else if (isBottom) { rectBottom += slideY; if (rectBottom > measuredHeight ) rectBottom = measuredHeight ; if (rectBottom < rectTop + cornerLength * 2) rectBottom = rectTop + cornerLength * 2; } invalidate(); downX = moveX; downY = moveY; } } break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: isLeft = false; isRight = false; isTop = false; isBottom = false; isMove = false; isSlideLeft = false; isSlideRight = false; isSlideTop = false; isSlideBottom = false; break; } return true; } /** * 得到裁剪区域的margin值 */ public float[] getCutArr() { float[] arr = new float[4]; arr[0] = rectLeft ; arr[1] = rectTop ; arr[2] = rectRight ; arr[3] = rectBottom ; return arr; } public int getRectWidth() { return (int) (measuredWidth); } public int getRectHeight() { return (int) (measuredHeight); } public void setAspect(float aspect){ this.aspect = aspect; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (measuredWidth == 0) { initParams(); } } private void initParams() { measuredWidth = getMeasuredWidth(); measuredHeight = getMeasuredHeight(); if(aspect == -1){ cornerLength = measuredWidth / 6; rectRight = measuredWidth ; rectLeft = 0; rectTop = 0; rectBottom = measuredHeight ; }else{ float vh = measuredWidth*1.0f/measuredHeight; if(aspect > 1){ cornerLength = measuredWidth / 6; }else{ cornerLength = measuredHeight / 6; } if(aspect > vh){ rectLeft = 0; rectRight = measuredWidth; float h = measuredWidth/aspect; rectTop = (measuredHeight - h)/2; rectBottom = rectTop + h; }else{ rectTop = 0; rectBottom = measuredHeight; float w = measuredHeight*aspect; rectLeft = (measuredWidth - w)/2; rectRight = rectLeft + w; } } } @Override protected void onDraw(Canvas canvas) { paint.setStrokeWidth(dp1); //绘制裁剪区域的矩形, 传入margin值来确定大小 canvas.drawRect(rectLeft, rectTop, rectRight, rectBottom, paint); //绘制四条分割线和四个角 drawLine(canvas, rectLeft, rectTop, rectRight, rectBottom); } /** * 绘制四条分割线和四个角 */ private void drawLine(Canvas canvas, float left, float top, float right, float bottom) { paint.setStrokeWidth(1); //绘制四条分割线 float startX = (right - left) / 3 + left; float startY = top; float stopX = (right - left) / 3 + left; float stopY = bottom; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = (right - left) / 3 * 2 + left; startY = top; stopX = (right - left) / 3 * 2 + left; stopY = bottom; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = left; startY = (bottom - top) / 3 + top; stopX = right; stopY = (bottom - top) / 3 + top; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = left; startY = (bottom - top) / 3 * 2 + top; stopX = right; stopY = (bottom - top) / 3 * 2 + top; canvas.drawLine(startX, startY, stopX, stopY, paint); paint.setStrokeWidth(dp3); //绘制四个角 startX = left - dp3 / 2; startY = top; stopX = left + cornerLength; stopY = top; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = left; startY = top; stopX = left; stopY = top + cornerLength; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = right + dp3 / 2; startY = top; stopX = right - cornerLength; stopY = top; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = right; startY = top; stopX = right; stopY = top + cornerLength; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = left; startY = bottom; stopX = left; stopY = bottom - cornerLength; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = left - dp3 / 2; startY = bottom; stopX = left + cornerLength; stopY = bottom; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = right + dp3 / 2; startY = bottom; stopX = right - cornerLength; stopY = bottom; canvas.drawLine(startX, startY, stopX, stopY, paint); startX = right; startY = bottom; stopX = right; stopY = bottom - cornerLength; canvas.drawLine(startX, startY, stopX, stopY, paint); }}使用的时候,只要把这个CutView盖在图片的View上,CutView的宽高必须和图片View的显示宽高一样
我是这样计算的
int screenWidth = mWidthPixels;int screenHeight = mHeightPixels; int left,top,viewWidth,viewHeight;float sh = screenWidth*1.0f/screenHeight;float vh = videoWidth *1.0f/ videoHeight;if(sh < vh){ left = 0; viewWidth = screenWidth; viewHeight = (int)(videoHeight *1.0f/ videoWidth *viewWidth); top = (screenHeight - viewHeight)/2;}else{ top = 0; viewHeight = screenHeight; viewWidth = (int)(videoWidth *1.0f/ videoHeight *viewHeight); left = (screenWidth - viewWidth)/2;}LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(viewWidth,viewHeight);params.leftMargin = left;params.topMargin = top;params.bottomMargin = mHeightPixels - top - viewHeight;videoView.setLayoutParams(params);设置是否比例画框
cutView.setAspect(-1);
-1表示不用,需要比例显示的话就传入width*1.0f/heigh
关于"android怎么实现简单的矩形裁剪框"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
移动
矩形
手指
分割线
知识
边界
位置
同时
图片
效果
方法
模式
比例
范围
行业
不同
实用
上下
不用
两个
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网络科技
广州紫鲸互联网科技有限公司
山东特亿宝互联网科技有限公司
紫鲸互联网科技
致聘互联网科技
美国互联网黑科技
深圳天众互联网科技公司
海南科技产业互联网平台
互联网科技公司的市场部门
中国科技互联网公司收入
央行互联网金融科技公司
互联网科技产业特征
未来五年的互联网科技
乌苏新华互联网科技做什么的
中国科技创新与世界互联网大会
互联网科技大赛获奖感言
江苏苏星互联网科技有限公司
神州科技互联网有限公司
吉林省码上互联网科技电话
银川新华互联网科技学校招聘
狮子座互联网科技培训
互联网汽车科技小镇
河南猎农互联网科技有限公司
迪庆互联网科技招生
半导体是互联网高科技吗
互联网科技融合创新
神州科技互联网有限公司
西安有哪些互联网高科技企业
吉林省码上互联网科技电话
福仕德教育科技互联网