本文实例为大家分享了Android实现自动吸附功能的具体代码,供大家参考,具体内容如下
1.简述
最近开发app过程中要实现拖动view后要可以自动吸附功能,所以需要自定义view来在onTouchEvent中来利用动画来实现此功能
2.功能代码部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; public class AdsorbentViews extends ImageView { private int maxWidth; private int maxHeight; private int viewWidth; private int viewHeight; private float downx; private float downy; private Context mContext; public CustomViews(Context context) { this (context, null ); } public CustomViews(Context context, AttributeSet attrs) { this (context, attrs, 0 ); } public CustomViews(Context context, AttributeSet attrs, int defStyleAttr) { super (context, attrs, defStyleAttr); mContext = context; } @Override protected void onDraw(Canvas canvas) { super .onDraw(canvas); DisplayMetrics outMetrics = new DisplayMetrics(); WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); windowManager.getDefaultDisplay().getRealMetrics(outMetrics); //屏幕的宽度 maxWidth = outMetrics.widthPixels; //屏幕的高度 maxHeight = outMetrics.heightPixels; /** * 控件的宽高 */ viewWidth = canvas.getWidth(); viewHeight = canvas.getHeight(); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: clearAnimation(); downx = event.getX(); downy = event.getY(); return true ; case MotionEvent.ACTION_MOVE: float moveX = event.getRawX() - downx; float moveY = event.getRawY() - downy; moveX = moveX < 0 ? 0 : (moveX + viewWidth > maxWidth) ? (maxWidth - viewWidth) : moveX; moveY = moveY < 0 ? 0 : (moveY + viewHeight) > maxHeight ? (maxHeight - viewHeight) : moveY; this .setY(moveY); this .setX(moveX); return true ; case MotionEvent.ACTION_UP: //做吸附效果 float centerX = getX() + viewWidth / 2 ; if (centerX > maxWidth/ 2 ){ //靠右吸附 animate().setInterpolator( new DecelerateInterpolator()) .setDuration( 500 ) .x(maxWidth-viewWidth) .y(maxHeight-viewHeight) .start(); } else { animate().setInterpolator( new DecelerateInterpolator()) .setDuration( 500 ) .x( 0 ) .y(maxHeight-viewHeight) .start(); } return true ; default : return super .onTouchEvent(event); } } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/baidu_41666295/article/details/104014608