在水平滑动的片段fadeout

时间:2013-10-23 15:04:15

标签: android android-fragments swipe ontouchlistener

在我的游戏中,我的全屏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。

例如,在宽度为800像素的设备上, mMaxSlide = 400,所以当我触摸屏幕时Fragment的alpha为1.0,当我滑动200px时它应该得到alpha = 0.5等等..

Frgament移动超过 mMaxSlide 时,我隐藏它,否则它会以完全不透明的方式返回到他的初始位置。

问题是当我测试时:

  • 正确的滑动是正确的,因为Fragment用我的手指移动但从不淡出(除非我快速滑动)并且总是回到初始位置..
  • 左侧滑动根本不起作用,稍微移动导致Fragment向远处滑动,因为 mActualMotionX 急剧增加..

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我回答我自己的问题:

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

我的布局由全屏FrameLayout组成,其中包含RelativeLayout,因此聆听者设置为FrameLayout,只有RelativeLayout与他的孩子一起移动,希望消失:p