我想制作像facebook一样的聊天室。正如您所看到的,当您拖动聊天头时,它会跟随您的手指移动(< - 好吧我可以处理它)。松开手指后,聊天头将移动/粘在屏幕的左/右边缘。您可以查看此clip
编辑:
按照Junior Buckeridge的一些指示,这个效果完成了!但是它看起来并不顺利,尽管我改变了参数:(。检查clip
这是我的代码:
iv.setOnTouchListener(new View.OnTouchListener() {
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = params.x;
initialY = params.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
return true;
case MotionEvent.ACTION_UP:
while (params.x > 0
&& params.x < outMetrics.widthPixels - 3)
if (params.x <= outMetrics.widthPixels / 2) {
TranslateAnimation animate = new TranslateAnimation(
params.x, params.x - 3,
Animation.RELATIVE_TO_SELF,
Animation.RELATIVE_TO_SELF);
params.x -= 3;
animate.setDuration(100);
animate.setFillAfter(true);
iv.setAnimation(animate);
manager.updateViewLayout(iv, params);
} else {
TranslateAnimation animate = new TranslateAnimation(
params.x, params.x + 3,
Animation.RELATIVE_TO_SELF,
Animation.RELATIVE_TO_SELF);
params.x += 3;
animate.setDuration(100);
animate.setFillAfter(true);
iv.setAnimation(animate);
manager.updateViewLayout(iv, params);
}
return true;
case MotionEvent.ACTION_MOVE:
params.x = initialX
+ (int) (event.getRawX() - initialTouchX);
params.y = initialY
+ (int) (event.getRawY() - initialTouchY);
manager.updateViewLayout(iv, params);
return true;
}
return false;
}
});
答案 0 :(得分:1)
您必须处理(MotionEvent.ACTION_UP | MotionEvent.ACTION_CANCEL)事件以确定事件的当前位置。然后计算设备宽度并根据覆盖位置继续。 您可以使用
获取设备宽度DisplayMetrics dm = context.getResources().getDisplayMetrics();
int w = dm.widthPixels;
boolean goLeft = (event.getRawX() > width/2 - view.getWidth()/2) ? false : true;
编辑: 如果你想设置一个动画,并且你不在活动上下文之外(我认为这会导致使用TranslateAnimation,这将是直截了当的),你必须创建一个基本动画,及时更新布局参数。类似的东西:
while(true){
if(goLeft){
if(view.getLeft()/2>0){
left -= LEFT_STEP;
}else{
left = 0;
break;
}
}else{
if(view.getRight()<w){
left += LEFT_STEP;
}else{
left = w - view.getWidth();
break;
}
}
SystemClock.sleep(SLEEP_TIME_IN_MILLIS);
}
尝试改变参数以获得平滑的动画效果。 希望能帮助到你。