3

そのため、ユーザーが指を右から左にドラッグして 2 番目のビューに移動できるインターフェイスを作成しようとしています。ドラッグされている最初のビューは右から左に移動します。Android デバイスのホーム画面と非常によく似ており、ユーザーが画面を左右にドラッグすると、そこから別の画面が表示されます。これまでのところ、フリッパーが2つのxmlファイルを保存するビュースイッチャーがあります。しかし、ドラッグ ジェスチャの使い方がわかりません。どんな例でも大歓迎です。

ありがとうございました

4

2 に答える 2

0

これはあなたが役に立つと思うかもしれないリンクです..どんな質問でも私に戻ってください.

Android 用 Horizo​​ntalPager Horizo​​ntalPager は、Marc Reichelt の RealViewSwitcher の修正版です。これは基本的に、全幅の子にスナップする水平 ScrollView です (Android のホーム画面の切り替え動作と同様)。この変更されたバージョンは、垂直スクロールの子をサポートします

于 2011-05-04T08:29:55.367 に答える
0

ドラッグ ジェスチャとイメージ スイッチ効果を統合する例を 1 つだけ書きます。それが役に立てば幸い。

必要なすべてのリソースとコードは次のとおりです。

  1. メイン レイアウト: レイアウトに ImageSwitcher を追加します。

  2. R.drawable.s3、R.drawable.s4 という名前の 2 つのドローアブル

  3. 2 つのアニメーション ファイル、slide_right_in、slide_left_out

        public class PureTestActivity extends Activity{
            final String TAG = PureTestActivity.class.getSimpleName();
            /** Called when the activity is first created. */
    
            LinearLayout mainLL;
            GestureDetector gestureDetector;
            ImageSwitcher vs;
            int imageIdx = 0;
            int[] imageResId = {R.drawable.s3, R.drawable.s4};
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
    
    
                mainLL = (LinearLayout)findViewById(R.id.main);
    
                vs = (ImageSwitcher)findViewById(R.id.viewSwitcher1);
                vs.setFactory(new ViewFactory(){
    
            @Override
            public View makeView() {
    
                  ImageView i = new ImageView(PureTestActivity.this);
                  i.setBackgroundColor(0xFF000000);
                  i.setImageResource(R.drawable.s3);
                  i.setScaleType(ImageView.ScaleType.FIT_CENTER);
                  i.setLayoutParams(new ImageSwitcher.LayoutParams(
                    LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                  return i;
            }
        });
    
    
        vs.setInAnimation(AnimationUtils.loadAnimation(this,
                android.R.anim.fade_in));
        vs.setOutAnimation(AnimationUtils.loadAnimation(this,
                android.R.anim.fade_out));
        //start for touch events  Gesture detection
        gestureDetector = new GestureDetector(new MyGestureDetector());
        View.OnTouchListener gestureListener = new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
    
                Log.d(TAG, "ontouch event.");
                if (gestureDetector.onTouchEvent(event)) {
                    return true;
                }
                return false;
            }
        };
        vs.setOnTouchListener(gestureListener);
    }     
       class MyGestureDetector extends SimpleOnGestureListener {
    
            final String TAG = MyGestureDetector.class.getSimpleName();
    
            // for touch left or touch right events
            private static final int SWIPE_MIN_DISTANCE = 60;   //default is 120
            private static final int SWIPE_MAX_OFF_PATH = 250;
            private static final int SWIPE_THRESHOLD_VELOCITY = 200;
    
            @Override
            public boolean onDown(MotionEvent e) {
    
                Log.d(TAG, " on down events :" + e.getAction() );
                return true;
            }
    
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    
                Log.d(TAG, " on filing event, first velocityX :" + velocityX +
                        " second velocityY" + velocityY);
                try {
                    if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                        return false;
                    // right to left swipe
                    if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                            onHorizonTouch(true);  // left
    
                    }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                            onHorizonTouch(false); // right   
    
                    }
                } catch (Exception e) {
                    // nothing
                }
                return false;
            }
    
            void onHorizonTouch(Boolean toLeft){
                if(toLeft && imageIdx>0)
                {
                    vs.setInAnimation(AnimationUtils.loadAnimation(
                            getApplicationContext(), R.anim.slide_right_in));
                    // 设置切出动画
                    vs.setOutAnimation(AnimationUtils.loadAnimation(
                            getApplicationContext(), R.anim.slide_left_out));
                    PureTestActivity.this.vs.setImageResource(imageResId[--imageIdx]);
                }
                if(!toLeft && imageIdx<1)
                {
                    vs.setInAnimation(AnimationUtils.loadAnimation(PureTestActivity.this,
                            android.R.anim.slide_in_left));
                    vs.setOutAnimation(AnimationUtils.loadAnimation(PureTestActivity.this,
                            android.R.anim.slide_out_right));
                    PureTestActivity.this.vs.setImageResource(imageResId[++imageIdx]);
                }
    
            };
        }
    

    }

于 2011-10-21T15:20:52.830 に答える