Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to implement a simple rectangular clipping box with android

2025-01-29 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Development >

Share

Shulou(Shulou.com)05/31 Report--

This article mainly introduces the relevant knowledge of "how to achieve a simple rectangular clipping box in android". The editor shows you the operation process through an actual case. The method of operation is simple and fast, and it is practical. I hope this article "how to achieve a simple rectangular clipping box in android" can help you solve the problem.

The normal mode is like this.

Simple addition of proportional tailoring

Paste code

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 = rectTop & & downY = rectLeft & & downX = rectTop & & downY measuredWidth) {/ / determine the moving boundary of the x-axis rectLeft-= slideX; rectRight-= slideX } / / change the values of top and rectTop at the same time to achieve the effect of moving up and down (rectTop)

< 0 || rectBottom >

MeasuredHeight) {/ / determine the moving boundary of the y-axis rectTop-= slideY; rectBottom-= slideY;} / / Real-time trigger onDraw () method 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) / / draw the rectangle of the crop region, pass in the margin value to determine the size canvas.drawRect (rectLeft, rectTop, rectRight, rectBottom, paint); / / draw four split lines and four corner drawLine (canvas, rectLeft, rectTop, rectRight, rectBottom) } / * draw four split lines and four corners * / private void drawLine (Canvas canvas, float left, float top, float right, float bottom) {paint.setStrokeWidth (1); / / draw four split lines 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) / / draw four corners 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);}}

When using, as long as the CutView is covered on the View of the picture, the width and height of the CutView must be the same as the display width and height of the picture View

This is how I calculate it.

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)

Sets whether to scale the frame

CutView.setAspect (- 1)

-1 means no. If you need scale display, input width*1.0f/heigh.

This is the end of the introduction to "how to achieve a simple rectangular clipping box in android". Thank you for reading. If you want to know more about the industry, you can follow the industry information channel. The editor will update different knowledge points for you every day.

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Development

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report