Android 自定义View 一个可以自由拖拽、边缘拉伸的view

编程入门 行业动态 更新时间:2024-10-16 16:43:58

Android <a href=https://www.elefans.com/category/jswz/34/1771438.html style=自定义View 一个可以自由拖拽、边缘拉伸的view"/>

Android 自定义View 一个可以自由拖拽、边缘拉伸的view

  之前在开发一个项目的时候,有做过一个这样的效果,从项目中抽出来,写了一个demo,给大家看下,抛砖引玉啊。

  先看看实现的效果:

实现思路

1.如图上述效果,主要实现了两个效果:一是移动view的中心位置,可以实现view的自由拖拽移动,二是在右边缘、下边缘滑动的时候,view的宽、高跟着拉伸。

2.view的移动,可以使用setMargins(left ,top,right,bottom)方法,通过改变left、top的值来实现,view拉伸,可以通过不断改变LayoutParams width、height从而实现view的拉伸。

3.方法有了,还有一些细节要处理,就是如何区分手指滑动是中心移动还是朝某个方向移动。这里给大家看一张图,就能大概区分view移动位置。

  我们一个view分为这9个移动方向,目前我们用到只有center、right、bottom这几个方向,其实后续如果实现别的效果,只需要这个基础上区分其余的方向和对应的逻辑,比如实现右下角拉伸图片拉伸的效果,也是可以的。

代码实现

  实现思路有了,接下来就是代码实现了。

  首先是通过手指滑动的坐标区分方向

    // 定义view的移动方向private static final int LEFT_TOP = 0x17;private static final int RIGHT_TOP = 0x18;private static final int LEFT_BOTTOM = 0x19;private static final int RIGHT_BOTTOM = 0x20;private static final int TOP = 0x21;private static final int LEFT = 0x22;private static final int BOTTOM = 0x23;private static final int RIGHT = 0x24;private static final int CENTER = 0x25;// 最小移动距离private int offset = 40;private int getDirection(View v, int x, int y) {int left = v.getLeft();int right = v.getRight();int bottom = v.getBottom();int top = v.getTop();if (x < offset && y < offset) {return LEFT_TOP;}if (y < offset && (right - left) - x < offset) {return RIGHT_TOP;}if (x < offset && (bottom - top) - y < offset) {return LEFT_BOTTOM;}if ((right - left) - x < offset && (bottom - top) - y < offset) {return RIGHT_BOTTOM;}if (x < offset) {return LEFT;}if (y < offset) {return TOP;}if ((right - left) - x < offset) {return RIGHT;}if ((bottom - top) - y < offset) {return BOTTOM;}return CENTER;}
其次是onTouch事件下处理移动和拉伸
    private void handleDrag(View v, MotionEvent event, int action) {switch (action) {case MotionEvent.ACTION_UP:endw = width;endh = height;if (dragDirection == CENTER) {if (Math.abs(lastX - downx) > 10 || Math.abs(lastY - downy) > 10) {move(v);}} else {if (Math.abs(endw - starw) > 5 || Math.abs(endh - starh) > 5) {handleSizeChanged(v);}}dragDirection = 0;break;case MotionEvent.ACTION_MOVE:int dx = ((int) event.getRawX()) - lastX;int dy = ((int) event.getRawY()) - lastY;switch (dragDirection) {case BOTTOM:bottom(v, dy);break;case RIGHT:right(v, dx);break;case CENTER:center(v, dx, dy);break;
//                    default:
//                        break;}lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;default:break;}}
  view移动关键代码
    /*** 处理view move** @param v*/private void move(View v) {Log.d(TAG, "...move ...");mlp = (RelativeLayout.LayoutParams) v.getLayoutParams();cleanParams(mlp);mlp.setMargins(v.getLeft(), v.getTop(), NotificationManagerCompat.IMPORTANCE_UNSPECIFIED,NotificationManagerCompat.IMPORTANCE_UNSPECIFIED);setLayoutParams(mlp);}
  view拉伸关键代码
    /*** 处理view 大小变化** @param v*/private void handleSizeChanged(View v) {Log.d(TAG, "...handleSizeChanged ...");mlp = (RelativeLayout.LayoutParams) v.getLayoutParams();mlp.width = endw + mRectSize / 2;mlp.height = endh + mRectSize / 2;setHeights((float) endh);setWidths((float) endw);v.setLayoutParams(mlp);}

  总结

  结尾总结一下,实现这样一个效果,首先需要把需求分析清楚,分解需求,想好实现思路,选用合适的api实现效果,然后就是细节处理,最后才代码实现。

  最后附上代码链接:github代码地址,有帮助的给个小星星,谢谢阅读。

 参考链接:.html
  

 

更多推荐

Android 自定义View 一个可以自由拖拽、边缘拉伸的view

本文发布于:2024-03-12 21:21:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1732447.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   拖拽   边缘   自由   Android

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!