左右スライド切替Activityを実現

8334 ワード

1.パッケージOnGestureListener(PS:コードの簡潔性のためにOnGestureListenerを1つのクラスにカプセル化し、メンバー変数としてonFlingメソッドのみを実現すればよい)
/** *   onFling * * @author Chuanhang.Gu * */
public class OnGestureListener implements android.view.GestureDetector.OnGestureListener {
    final int FLING_MIN_DISTANCE = 50;
    final float FLING_MIN_VELOCITY = 50;

    @Override
    public boolean onDown(MotionEvent e) {
        //  return true,  onFling 
        //  : activity setOnLongclick(true);
        // PS: : 
        return true;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // TODO Auto-generated method stub
        return false;
    }

}

2.activityでOnTouchListenerとインスタンス化GestureDetectorを実現
public class MiddleActivity extends Activity implements OnTouchListener {
    GestureDetector gd;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView textView = new TextView(this);
        textView.setText("Middle");
        textView.setBackgroundColor(getResources().getColor(R.color.green));
        setContentView(textView);
        textView.setOnTouchListener(this);
        gd = new GestureDetector(this, mFlingListener);
    }

    OnGestureListener mFlingListener = new com.example.viewpagerdemo1.OnGestureListener() {

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE
                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {
                Intent intent = new Intent(MiddleActivity.this,
                        LeftActivity.class);
                startActivity(intent);
                Toast.makeText(MiddleActivity.this, " ", Toast.LENGTH_SHORT)
                        .show();
                overridePendingTransition(R.anim.in_from_right,
                        R.anim.out_to_left);

            } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE
                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {

                //  Activity
                Intent intent = new Intent(MiddleActivity.this,
                        RightActivity.class);
                startActivity(intent);
                Toast.makeText(MiddleActivity.this, " ", Toast.LENGTH_SHORT)
                        .show();
                overridePendingTransition(R.anim.in_from_left,
                        R.anim.out_to_right);

            }

            return false;
        }

    };

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.performClick();
        return gd.onTouchEvent(event);
    }
}

上の原理はやはり比較的簡単です:現在のページにOnTouchListenerを追加して、このページのすべてのtouchイベントでonTouchメソッドを呼び出して、それをGestureDetectorに渡して処理します.GestureDetectorにリスニングを追加してコールバックし、OnGestureListenerに移行して処理します.3.activity切り替えのアニメーションを追加:startActivityを呼び出した後、onPendingIntentを呼び出し、activity切り替えアニメーションを有効にします.例えばin_from_left.xml(画面左側からアニメーション)
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" >
    <translate  android:duration="500" android:fromXDelta="-100%p" android:toXDelta="0%p" />
</set>

4.小さなコツは、activityスタックのシンプルさを保つために、MiddleActivityのlaunchModeをsingleTask 5に設定することができる.質問:ページにクリック可能なものがある場合、クリック可能な上(例えばButton上)でスライド切り替えactivityは無効です.6.Demoを添付しますので、ご参考までにhttp://download.csdn.net/detail/guchuanhang/9053801