Android自定义View,实现跟随手指滑动效果,
效果如下:
一,重写onTouchEvent方法 最后返回true
二,在MotionEvent.ACTION_MOVE情况下改变自定义view 的位置
代码如下:
public class FollowView extends TextView {private Context context;private float x = 0;//点击时候坐标位置private float y = 0;private float startx;//自定义view的开始坐标位置private float statty;public FollowView(Context context) {this(context, null);}public FollowView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public FollowView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN://获取点击的xy坐标x = event.getRawX();y = event.getRawY();Log.d("mile","event.getRawX():"+event.getRawY());Log.d("mile","event.getRawY():"+event.getRawY());//新建一个Rect来获取当前view的坐标位置Rect rect = new Rect();this.getGlobalVisibleRect(rect);startx = (rect.left); //设置当前view x坐标位置//获取状态来的高度Rect frame = new Rect();((Activity) getContext()).getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);int statusBarHeight = frame.top;statty = (rect.top - statusBarHeight);//设置当前view y坐标 需要减去状态来高度break;case MotionEvent.ACTION_MOVE:Log.d("mile","MotionEvent.ACTION_MOVE");//根据手指移动来算出移动的xy坐标this.setTranslationX(startx + event.getRawX() - x);this.setTranslationY(statty + event.getRawY() - y);break;case MotionEvent.ACTION_UP:break;}return true;}}
布局中使用
<com.goodboy.mile.View.FollowViewandroid:id="@+id/follow_view"android:layout_width="50dp"android:layout_height="50dp"android:background="@color/colorAccent"android:text="@string/app_name"/>
注:之前我在获取滑动的坐标的时候是使用MotionEvent中的getX()方法,发现有闪烁的问题,后来改成MotionEvent中的getRawX()方法就好了,
那么getX()与getRawX()有什么区别呢?
getX()是表示Widget相对于自身左上角的x坐标
而getRawX()是表示相对于屏幕左上角的x坐标值