广告
返回顶部
首页 > 资讯 > 精选 >android怎么实现简单的矩形裁剪框
  • 581
分享到

android怎么实现简单的矩形裁剪框

2023-06-30 15:06:11 581人浏览 独家记忆
摘要

这篇文章主要介绍“Android怎么实现简单的矩形裁剪框”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“android怎么实现简单的矩形裁剪框”文章能帮助大家解决问题。正常模式是这样的简单的添加了等比

这篇文章主要介绍“Android怎么实现简单的矩形裁剪框”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“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;    }         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怎么实现简单的矩形裁剪框”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: android怎么实现简单的矩形裁剪框

本文链接: https://www.lsjlt.com/news/329658.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • android实现简单的矩形裁剪框
    本文实例为大家分享了android实现矩形裁剪框的具体代码,供大家参考,具体内容如下 前阵子做视频编辑功能,视频裁剪功能不太好用,就简单的修改了一下 正常模式是这样的 简单的添加了...
    99+
    2022-11-13
  • android怎么实现简单的矩形裁剪框
    这篇文章主要介绍“android怎么实现简单的矩形裁剪框”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“android怎么实现简单的矩形裁剪框”文章能帮助大家解决问题。正常模式是这样的简单的添加了等比...
    99+
    2023-06-30
  • Vue实现简单基础的图片裁剪功能
    目录一、准备工作二、基本结构三、添加功能onMouseDownonMouseMoveonMouseUponMouseLeave四、总结近日,在写公司项目的时候接到一个需求:对已加载的...
    99+
    2022-11-13
  • 怎么用html5画出简单的矩形三角形
    这篇文章主要介绍“怎么用html5画出简单的矩形三角形”,在日常操作中,相信很多人在怎么用html5画出简单的矩形三角形问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用h...
    99+
    2022-10-19
  • Android裁剪图片为圆形图片的实现原理与代码
    以前在eoe论坛中找过裁剪图片为圆形图片的方法,但是效果都不是很理想,这几天因为公司业务的要求,需要对头像进行裁剪以圆形的方式显示,这个方法是根据传入的图片的高度(height...
    99+
    2022-06-06
    图片 Android
  • Android怎么实现手势划定区域裁剪图片
    这篇文章主要介绍“Android怎么实现手势划定区域裁剪图片”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么实现手势划定区域裁剪图片”文章能帮助大家解决问题。需求:拍照,然后对图片进...
    99+
    2023-06-30
  • thinkphp框架中的图片旋转裁剪功能怎么实现
    这篇文章主要讲解了“thinkphp框架中的图片旋转裁剪功能怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“thinkphp框架中的图片旋转裁剪功能怎么实现”吧!第一步:安装think...
    99+
    2023-07-06
  • Java是怎么实现图片裁剪功能的
    今天就跟大家聊聊有关Java是怎么实现图片裁剪功能的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言下面提供将图片按照自定义尺寸进行裁剪的Java工具类,一如既往的实用主义。Mav...
    99+
    2023-06-29
  • Android自定义ViewGroup实现带箭头的圆角矩形菜单
    本文和大家一起做一个带箭头的圆角矩形菜单,大概长下面这个样子:  要求顶上的箭头要对准菜单锚点,菜单项按压反色,菜单背景色和按压色可配置。 最简单的做法就是让U...
    99+
    2022-06-06
    菜单 Android
  • 怎么用Android Camera实现最简单的预览框显示
    本篇内容介绍了“怎么用Android Camera实现最简单的预览框显示”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Androi...
    99+
    2023-06-30
  • 怎么在Linux的命令行中实现裁剪图片
    本篇内容介绍了“怎么在Linux的命令行中实现裁剪图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!当涉及到在Linux中转换或编辑图像文件...
    99+
    2023-06-13
  • Android自定义对话框的简单实现
    本文实例为大家分享了Android自定义对话框的具体实现代码,供大家参考,具体内容如下 1、定义对话框的布局 <xml version="1.0" encoding="utf-...
    99+
    2022-11-13
  • Android怎么实现一个简单的单词本
    这篇文章主要介绍了Android怎么实现一个简单的单词本的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么实现一个简单的单词本文章都会有所收获,下面我们一起来看看吧。本文基于Java实现了一个简单...
    99+
    2023-06-29
  • Android自定义对话框Dialog的简单实现
    本文着重研究了自定义对话框,通过一下步骤即可清晰的理解原理,通过更改界面设置和style类型,可以应用在各种各样适合自己的App中。首先来看一下效果图:首先是activity的界面点击了上述图片的按钮后,弹出对话框:点击对话框的确定按钮:点...
    99+
    2023-05-30
    android 对话框 dialog
  • 怎样实现简单的RPC框架
    怎样实现简单的RPC框架,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.定义上下文对象在RpcContext对象中增加一个map类型的参数对象,可以存放任意扩展的参数。2.R...
    99+
    2023-06-04
  • Android自定义View实现简单的圆形Progress效果
    先给大家展示下效果图,如果感觉不错,请参考实现思路: 我们要实现一个自定义的再一个圆形中绘制一个弧形的自定义View,思路是这样的:   先要创建一个类ProgressVie...
    99+
    2022-06-06
    view progress Android
  • 纯css3怎么实现简单的checkbox复选框和radio单选框
    这篇文章主要介绍“纯css3怎么实现简单的checkbox复选框和radio单选框”,在日常操作中,相信很多人在纯css3怎么实现简单的checkbox复选框和radio单选框问题上存在疑惑,小编查阅了各式...
    99+
    2022-10-19
  • Android中制作进度框和环形进度条的简单实例分享
    进度框 import android.content.Context; import android.graphics.Canvas; import android.gr...
    99+
    2022-06-06
    进度条 Android
  • Android Studio怎么实现简单绘图板
    这篇“Android Studio怎么实现简单绘图板”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android&...
    99+
    2023-06-30
  • Python怎么利用shutil模块实现文件的裁剪与压缩
    本篇内容介绍了“Python怎么利用shutil模块实现文件的裁剪与压缩”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!利用 shutil 实...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作