仿薄荷健康量尺的自定义view控件实现
- OverScroller
- Guseture
- ScrollTo
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.OverScroller;
public class MyView extends View {
private Paint paint;
private int moveX = 0;//当前滚动距离
private OverScroller scroller;
private GestureDetector gestureDetector;
private int width,height;//控件的宽高
private int count;
private int left;
private int right;
private int top;
private int bottom;
private int centerX;
private int minX;
private int maxX;
private int upType = 0;//初始值; 1 sroll 滚动松开 2快速滑动松开
public MyView(Context context) {
this(context, null);
}
public MyView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
public void init(Context context) {
paint = new Paint();
scroller = new OverScroller(context);
gestureDetector = new GestureDetector(context, new GestureDetector.OnGestureListener() {
@Override
public boolean onDown(MotionEvent motionEvent) {
return false;
}
@Override
public void onShowPress(MotionEvent motionEvent) {
}
@Override
public boolean onSingleTapUp(MotionEvent motionEvent) {
return false;
}
@Override
public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
upType = 1;
moveX = getScrollX() + (int) v;
scrollTo(moveX, 0);
invalidate();
return false;
}
@Override
public void onLongPress(MotionEvent motionEvent) {
}
@Override
public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1) {
upType = 2;
scroller.fling(getScrollX(), getScrollY(), -(int) v, 0, minX, maxX, 0, 0);
invalidate();
return false;
}
});
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getMeasuredWidth();
height = getMeasuredHeight();
int leftTextDistance = -3600;
int rightTextDistance = 4200;
minX = leftTextDistance;
maxX = rightTextDistance;
left = minX - width * 2;
right = maxX + width * 2;
count = (right - this.left) / 60;
top = height / 2 - 200;
bottom = height / 2 + 200;
centerX = width / 2;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint.setColor(0xFFF5F6FA);
canvas.drawRect(new Rect(left, top, right, bottom), paint);
paint.setColor(0xFFACAFB8);
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextSize(60);
// canvas.drawLine(centerX + moveX, top, centerX + moveX, height / 2 - 10, paint);
for (int i = 0; i < count / 2; i++) {
if (i % 5 == 0) {
canvas.drawLine(centerX + i * 60, top, centerX + i * 60, top + 200, paint);
canvas.drawLine(centerX - i * 60, top, centerX - i * 60, top + 200, paint);
if (160 - i >= 100 && 160 - i <= 160) {
canvas.drawText((160 - i) + "", centerX + i * -60, bottom - 60, paint);
}
if (160 + i >= 160 && 160 + i <= 230) {
canvas.drawText((160 + i) + "", centerX + i * 60, bottom - 60, paint);
}
} else {
canvas.drawLine(centerX + i * 60, top, centerX + i * 60, top + 100, paint);
canvas.drawLine(centerX - i * 60, top, centerX - i * 60, top + 100, paint);
}
}
paint.setStrokeWidth(4);
paint.setColor(0xFF21CCA3);
canvas.drawLine(centerX + moveX, top, centerX + moveX, top + 200, paint);
paint.setTextSize(100);
if (moveX > 0 && moveX <= 4200 && moveX / 60f - (moveX / 60) >= 0.5) {
canvas.drawText("" + (160 + moveX / 60 + 1), centerX + moveX, top - 100, paint);
} else if (moveX > 0 && moveX <= 4200 && moveX / 60f - (moveX / 60) < 0.5) {
canvas.drawText("" + (160 + moveX / 60), centerX + moveX, top - 100, paint);
} else if (moveX < 0 && moveX >= -3600 && moveX / 60f - moveX / 60 <= -0.5) {
canvas.drawText("" + (160 + moveX / 60 - 1), centerX + moveX, top - 100, paint);
} else if (moveX < 0 && moveX >= -3600 && moveX / 60f - moveX / 60 > -0.5) {
canvas.drawText("" + (160 + moveX / 60), centerX + moveX, top - 100, paint);
} else if (moveX == 0) {
canvas.drawText("" + (160), centerX + moveX, top - 100, paint);
} else if (moveX > 4200) {
canvas.drawText("" + (230), centerX + moveX, top - 100, paint);
} else if (moveX < -3600) {
canvas.drawText("" + (100), centerX + moveX, top - 100, paint);
}
}
private static final String TAG = "MyView";
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
isRightPosition = false;
upType = 0;
break;
case MotionEvent.ACTION_UP:
if (upType == 1) {
if (moveX > 4200) {
scroller.startScroll(getScrollX(), getScrollY(), 4200 - moveX, 0);
} else if (moveX < -3600) {
scroller.startScroll(getScrollX(), getScrollY(), -3600 - moveX, 0);
} else {
goToNumberPosition();
}
invalidate();
}
break;
}
return true;
}
public void goToNumberPosition() {
if (Math.abs(moveX) / 60f - Math.abs(moveX) / 60 >= 0.5) {//向右滑动
int dx = 60 - (Math.abs(moveX) % 60);
if (moveX >= 0) {
scroller.startScroll(getScrollX(), getScrollY(), dx, 0);
} else {
scroller.startScroll(getScrollX(), getScrollY(), -dx, 0);
}
invalidate();
} else {
int dx = -(Math.abs(moveX) % 60);
if (moveX >= 0) {
scroller.startScroll(getScrollX(), getScrollY(), dx, 0);
} else {
scroller.startScroll(getScrollX(), getScrollY(), -dx, 0);
}
}
}
private boolean isRightPosition = false;
@Override
public void computeScroll() {
super.computeScroll();
if (scroller.computeScrollOffset()) {
moveX = scroller.getCurrX();
scrollTo(scroller.getCurrX(), scroller.getCurrY());
postInvalidate();
} else {
if (upType == 2 && scroller.isFinished() && !isRightPosition) {
isRightPosition = true;
goToNumberPosition();
postInvalidate();
}
}
}
}
网友评论