本文实例为大家分享了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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

android实现简单的矩形裁剪框的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  8. 在iOS上向后播放HTML5视频

    我试图在iPad上反向播放HTML5视频.HTML5元素包括一个名为playbackRate的属性,它允许以更快或更慢的速率或相反的方式播放视频.根据Apple’sdocumentation,iOS不支持此属性.通过每秒多次设置currentTime属性,可以反复播放,而无需使用playbackRate.这种方法适用于桌面Safari,但似乎在iOS设备上的搜索限制为每秒1次更新–在我的情况下太慢了.有没有办法在iOS设备上向后播放HTML5视频?解决方法iOS6Safari现在支持playbackRat

  9. 使用 Swift 语言编写 Android 应用入门

    Swift标准库可以编译安卓armv7的内核,这使得可以在安卓移动设备上执行Swift语句代码。做梦,虽然Swift编译器可以胜任在安卓设备上编译Swift代码并运行。这需要的不仅仅是用Swift标准库编写一个APP,更多的是你需要一些框架来搭建你的应用用户界面,以上这些Swift标准库不能提供。简单来说,构建在安卓设备上使用的Swiftstdlib需要libiconv和libicu。通过命令行执行以下命令:gitclonegit@github.com:SwiftAndroid/libiconv-libi

  10. Android – 调用GONE然后VISIBLE使视图显示在错误的位置

    我有两个视图,A和B,视图A在视图B上方.当我以编程方式将视图A设置为GONE时,它将消失,并且它正下方的视图将转到视图A的位置.但是,当我再次将相同的视图设置为VISIBLE时,它会在视图B上显示.我不希望这样.我希望视图B回到原来的位置,这是我认为会发生的事情.我怎样才能做到这一点?编辑–代码}这里是XML:解决方法您可以尝试将两个视图放在RelativeLayout中并相对于彼此设置它们的位置.

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部