核心代码
@Override
public boolean onTouchEvent(MotionEvent event) {
int currentX = (int) event.getX();//实时触碰的X轴坐标
int currentY = (int) event.getY();//实时触碰的Y轴坐标
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
previousX = currentX;//记录初始X轴坐标
previousY = currentY;//记录初始Y轴坐标
leftDistance = getLeft();
rightDistance = getRight();
actionDownTime = System.currentTimeMillis();//记录手指按下的时间
break;
case MotionEvent.ACTION_MOVE:
int offsetX = currentX - previousX;//计算X轴方向偏移
int offsetY = currentY - previousY;//计算Y轴方向偏移
int top = getTop()+offsetY;
if (top<100){
//限制可拖动的最高位置,同理可限制最下、最左和最右
top = 100;
}
layout(getLeft()+offsetX,top,getRight()+offsetX,top+getHeight());//根据坐标重新放置当前View的位置
break;
case MotionEvent.ACTION_UP:
displayMetrics=getResources().getDisplayMetrics();
windowWidth=displayMetrics.widthPixels;//获取屏幕宽度
int finalLeftDistance=getLeft();
if (finalLeftDistance>(windowWidth-getWidth())/2){//以屏幕中间为界限,平滑回到水平方向的右边
//ValueAnimator数值发生器,产生有一定规律的数值,从而控制动画实现
ValueAnimator valueAnimator=ValueAnimator.ofInt(getLeft(),windowWidth-100-getWidth());
valueAnimator.setDuration(500);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int smoothX = (int)animation.getAnimatedValue();
layout(smoothX,getTop(),smoothX+getWidth(),getBottom());
}
});
valueAnimator.start();
}else if (finalLeftDistance<(windowWidth-getWidth())/2){//以屏幕中间为界限,平滑回到水平方向的左边
ValueAnimator valueAnimator=ValueAnimator.ofInt(getLeft(),100);
valueAnimator.setDuration(500);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int smoothX = (int)animation.getAnimatedValue();
layout(smoothX,getTop(),smoothX+getWidth(),getBottom());
}
});
valueAnimator.start();
}
actionUpTime = System.currentTimeMillis();//记录手指抬起的时间
long intervalTime = actionUpTime - actionDownTime;
if (intervalTime < 200){ //判断按下抬起的时间间隔,点击回调解决TouchEvent和点击事件冲突的问题
onClickListener.onClick();
}
break;
}
return true;
}
自定义可拖动LinearLayout
最新推荐文章于 2024-05-22 09:38:44 发布