0

在我的游戏中,我有一个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急剧增加..

我究竟做错了什么 ?

4

1 回答 1

0

我回答我自己的问题:

如果我在触摸时不移动Fragment,淡出效果会起作用,所以我只需要移动我的布局的一部分,以保持正在聆听的布局。

我的布局由FrameLayout全屏和其中的一个组成RelativeLayout,因此侦听器设置为,FrameLayout并且只有RelativeLayout他的孩子可以根据需要移动和淡出:p

于 2013-10-23T23:48:11.907 回答