在我的游戏中,我的全屏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 急剧增加.. 我做错了什么?
答案 0 :(得分:0)
我回答我自己的问题:
如果我在触摸时没有移动Fragment
,则淡出效果会起作用,所以我只需要移动部分布局,以保持正在聆听的部分。
我的布局由全屏FrameLayout
组成,其中包含RelativeLayout
,因此聆听者设置为FrameLayout
,只有RelativeLayout
与他的孩子一起移动,希望消失:p