如何在 Android 中使用拖动手势切换 2 个不同的视图?

发布于 2024-09-17 07:24:20 字数 184 浏览 3 评论 0原文

所以我试图创建一个界面,用户可以在其中从右向左拖动手指以到达第二个视图,并且被拖动的第一个视图将从右向左移动。与 Android 设备的主屏幕非常相似,用户可以向左或向右拖动屏幕,然后就会出现另一个屏幕。到目前为止,我有一个视图切换器,其中 Flipper 将存储两个 xml 文件。但我不知道如何使用拖动手势?任何例子将不胜感激。

谢谢

so im trying to create an interface where the user can drag their finger from the right to the left to get to the second view, and the first view being dragged will move from right to left. very similar to an android device home screen, where the user can drag a screen to the left or right and another screen will emerge from there. I have so far a View switcher where flipper will store two xml files. But i do not know how to use the drag gesture? any examples would be greatly appreciated.

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清泪尽 2024-09-24 07:24:20

这是一个链接,您可能会发现有用。如果有任何疑问,请回复我。

Android 版水平分页器
Horizo​​ntalPager是一个修改版本
Marc Reichelt 的 RealViewSwitcher。
本质上是一个水平的
捕捉到全角的 ScrollView
孩子(就像Android主屏幕的
切换行为)。这个修改了
版本支持垂直滚动
儿童

Here's a link which u might find usefull..get back to me for any query.

HorizontalPager for Android
HorizontalPager is a modified version
of Marc Reichelt's RealViewSwitcher.
It's essentially a horizontal
ScrollView that snaps to a full-width
child (like the Android homescreen's
switching behavior). This modified
version supports vertically scrolling
children

停顿的约定 2024-09-24 07:24:20

我只是写了一个集成拖动手势和图像切换效果的例子。希望有帮助。

所有需要的资源和代码如下:

  1. 主布局:在布局中添加一个 ImageSwitcher

  2. 两个名为 R.drawable.s3、R.drawable 的可绘制对象。 drawable.s4

  3. 两个动画文件,slide_right_in、slide_left_out

     公共类 PureTestActivity 扩展 Activity{
            最终字符串标记 = PureTestActivity.class.getSimpleName();
            /** 首次创建活动时调用。 */
    
            线性布局mainLL;
            手势检测器 手势检测器;
            图像切换器对比;
            int imageIdx = 0;
            int[] imageResId = {R.drawable.s3, R.drawable.s4};
            @覆盖
            公共无效 onCreate(捆绑保存实例状态){
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
    
    
                mainLL = (LinearLayout)findViewById(R.id.main);
    
                vs = (ImageSwitcher)findViewById(R.id.viewSwitcher1);
                vs.setFactory(new ViewFactory(){
    
            @覆盖
            公共视图 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));
                  返回我;
            }
        });
    
    
        vs.setInAnimation(AnimationUtils.loadAnimation(这个,
                android.R.anim.fade_in));
        vs.setOutAnimation(AnimationUtils.loadAnimation(这个,
                android.R.anim.fade_out));
        //开始触摸事件手势检测
        gestureDetector = new GestureDetector(new MyGestureDetector());
        View.OnTouchListenergestureListener = new View.OnTouchListener() {
            公共布尔 onTouch(View v, MotionEvent 事件) {
    
                Log.d(TAG, "ontouch 事件。");
                if (gestureDetector.onTouchEvent(事件)) {
                    返回真;
                }
                返回假;
            }
        };
        vs.setOnTouchListener(gestureListener);
    }     
       类 MyGestureDetector 扩展 SimpleOnGestureListener {
    
            最终字符串TAG = MyGestureDetector.class.getSimpleName();
    
            // 用于向左触摸或向右触摸事件
            私有静态最终 int SWIPE_MIN_DISTANCE = 60; //默认为120
            私有静态最终int SWIPE_MAX_OFF_PATH = 250;
            私有静态最终int SWIPE_THRESHOLD_VELOCITY = 200;
    
            @覆盖
            公共布尔 onDown(MotionEvent e) {
    
                Log.d(TAG, " on down events :" + e.getAction() );
                返回真;
            }
    
            @覆盖
            公共布尔onFling(MotionEvent e1,MotionEvent e2,浮动速度X,浮动速度Y){
    
                Log.d(TAG, " 在归档事件中,第一个速度X :" + 速度X +
                        “第二速度Y”+速度Y);
                尝试 {
                    if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                        返回假;
                    // 从右向左滑动
                    if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                            onHorizo​​nTouch(真); // 左边
    
                    } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                            onHorizo​​nTouch(假); // 正确的   
    
                    }
                } catch (异常 e) {
                    // 没有什么
                }
                返回假;
            }
    
            void onHorizo​​nTouch(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]);
                }
    
            };
        }
    

    }

I just write one example integrate the drag gesture and image switch effect. Hope it helps.

All the needed resources and code as the following:

  1. main layout : add a ImageSwitcher into the layout

  2. two drawable named as R.drawable.s3, R.drawable.s4

  3. two animation files, 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]);
                }
    
            };
        }
    

    }

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文