在我的游戏中,我有一个Fragment
全屏模式,会弹出来指示哪个玩家必须玩。
玩家必须在Fragment
水平方向上滑动超过半个屏幕(向左或向右),这样他才能玩..
这是我的Fragment
代码:
public class PopPlayerFragment extends Fragment implements View.OnTouchListener{
[...]
private float mMaxSlide;
private float mInitialMotionX;
private float mActualMotionX;
private float mLastMotionX;
[...]
public View onCreateView (LayoutInflater inflater, ViewGroup container, [...]){
View v = inflater.inflate(R.layout.pfragment, container, false);
mMaxSlide = getActivity().getApplicationContext()
.getResources().getDisplayMetrics().widthPixels / 2;
[...]
v.setOnTouchListener(this);
return v;
}
@Override
public boolean onTouch(View v, MotionEvent event){
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
mInitialMotionX = event.getX();
return true;
case MotionEvent.ACTION_MOVE:
mActualMotionX = event.getX();
final float dx = mActualMotionX - mInitialMotionX;
final float adx = Math.abs(dx);
v.setX(v.getX() + dx);
if(adx <= mMaxSlide)
v.setAlpha(1.0f - (adx / mMaxSlide));
else
v.setAlpha(0.0f);
return true;
case MotionEvent.ACTION_UP:
mLastMotionX = event.getX();
final float adxup = Math.abs(mLastMotionX - mInitialMotionX);
if(adxup >= mMaxSlide){
getFragmentManager().beginTransaction().hide(this).commit();
} else{
v.setX(0.0f);
v.setAlpha(1.0f);
}
return true;
default: return false;
}
}
我想以Fragment
与移动手指相同的方式移动,并且希望它从 1 淡入到 0。
例如,在 800px 宽度的设备上,mMaxSlide = 400,所以当我触摸屏幕时,Fragment
的 alpha 为 1.0,当我滑动 200px 时,它应该得到 alpha = 0.5,依此类推。
当Frgament
移动超过mMaxSlide时,我将其隐藏,否则它会以完全不透明的方式返回到他的初始位置。
问题是当我测试这个时:
- 正确的滑动是可以的,因为
Fragment
我的手指移动但永远不会淡出(除非我快速滑动)并且总是回到初始位置.. - 向左滑动根本不起作用,稍微移动一下就会导致
Fragment
滑得很远,因为mActualMotionX急剧增加..
我究竟做错了什么 ?