私のゲームでは、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
のアルファは 1.0 になり、200px をスワイプするとアルファ = 0.5 になります。
がmMaxSlideFrgament
を超えて移動した場合は非表示にします。それ以外の場合は、完全な不透明度で最初の位置に戻ります。
問題は、これをテストすると次のようになることです。
- 右のスワイプは
Fragment
指で動くので問題ありませんが、フェードアウトすることはなく(非常に速くスワイプした場合を除く)、常に最初の位置に戻ります.. - mActualMotionXが大幅に増加するため、左スワイプがまったく機能しません。少し動かすと、
Fragment
が遠くにスライドします。
私は何を間違っていますか?