先给大家展示下效果图:

代码已上传至Github:高仿QQ小红点,如对您有帮助,欢迎star~感谢
绘制贝塞尔曲线:
主要是当在一定范围内拖拽时算出固定圆和拖拽圆的外切直线以及对应的切点,就可以通过path.quadTo()来绘制二阶贝塞尔曲线了~
整体思路:
1、当小红点静止时,什么都不做,只需要给自定义小红点QQBezierView(extends TextView)添加一个.9文件当背景即可
2、当滑动时,通过getRootView()获得顶级根View,然后new一个DragView ( extends View ) 来绘制各种状态时的小红点,并且通过getRootView().addView()的方式把DragView 加进去,这样DragView 就可以实现全屏滑动了
实现过程:
自定义QQBezierView ( extends TextView ) 并复写onTouchEvent来处理各种情况,代码如下:
@Override
public boolean onTouchEvent(MotionEvent event) {
//获得根View
View rootView = getRootView();
//获得触摸位置在全屏所在位置
float mRawX = event.getRawX();
float mRawY = event.getRawY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//请求父View不拦截
getParent().requestDisallowInterceptTouchEvent(true);
//获得当前View在屏幕上的位置
int[] cLocation = new int[2];
getLocationOnScreen(cLocation);
if (rootView instanceof ViewGroup) {
//初始化拖拽时显示的View
dragView = new DragView(getContext());
//设置固定圆的圆心坐标
dragView.setStickyPoint(cLocation[0] + mWidth / 2, cLocation[1] + mHeight / 2, mRawX, mRawY);
//获得缓存的bitmap,滑动时直接通过drawBitmap绘制出来
setDrawingCacheEnabled(true);
Bitmap bitmap = getDrawingCache();
if (bitmap != null) {
dragView.setCacheBitmap(bitmap);
//将DragView添加到RootView中,这样就可以全屏滑动了
((ViewGroup) rootView).addView(dragView);
setVisibility(INVISIBLE);
}
}
break;
case MotionEvent.ACTION_MOVE:
//请求父View不拦截
getParent().requestDisallowInterceptTouchEvent(true);
if (dragView != null) {
//更新DragView的位置
dragView.setDragViewLocation(mRawX, mRawY);
}
break;
case MotionEvent.ACTION_UP:
getParent().requestDisallowInterceptTouchEvent(false);
if (dragView != null) {
//手抬起时来判断各种情况
dragView.setDragUp();
}
break;
}
return true;
}