• 【Android 复习】:Android之ViewFlipper(二)


    通过手势移动屏幕
    上面是通过屏幕上的按钮来在屏幕间切换的,这看起来多少有点不符合Android的风格,如果要是能通过手势的左右滑动来实现屏幕的切换就比较优雅了。
    通过android.view.GestureDetector类可以检测各种手势事件,该类有两个回调接口分别用来通知具体的事件:
    GestureDetector.OnDoubleTapListener:用来通知DoubleTap事件,类似于鼠标的双击事件,该接口有如下三个回调函数:
      1.   onDoubleTap(MotionEvent e):通知DoubleTap手势,
      2.   onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该    函数通知);
      3.   onSingleTapConfirmed(MotionEvent e):用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,OPhone系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,    然后触发SingleTapConfirmed事件。
    GestureDetector.OnGestureListener:用来通知普通的手势事件,该接口有如下六个回调函数:
      1.   onDown(MotionEvent e):down事件;
      2.   onSingleTapUp(MotionEvent e):一次点击up事件;
      3.   onShowPress(MotionEvent e):down事件发生而move或则up还没发生前触发该事件;
      4.   onLongPress(MotionEvent e):长按事件;
      5.   onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手势事件;
      6.   onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上拖动事件。
    在上述事件中,如果在程序中处理的该事件就返回true否则返回false,在GestureDetector中也定义了一个SimpleOnGestureListener类,这是个助手类,实现了上述的所有函数并且都返回false。如果在项目中只需要监听某个事件继承这个类可以少些几个空回调函数。
     
    我们的Activity需要实现两个接口OnGestureListener,OnTouchListener。具体的代码如下所示,代码中都有相应的注释
    public class ViewFlipperDemo extends Activity implements OnGestureListener,OnTouchListener{  
        private ViewFlipper mFlipper;  
        GestureDetector mGestureDetector;  
        private int mCurrentLayoutState;  
        private static final int FLING_MIN_DISTANCE = 100;  
        private static final int FLING_MIN_VELOCITY = 200;  
       
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            mFlipper = (ViewFlipper) findViewById(R.id.flipper);  
            //注册一个用于手势识别的类  
            mGestureDetector = new GestureDetector(this);  
            //给mFlipper设置一个listener  
            mFlipper.setOnTouchListener(this);  
            mCurrentLayoutState = 0;  
            //允许长按住ViewFlipper,这样才能识别拖动等手势  
            mFlipper.setLongClickable(true);  
        }  
       
        /**  
         * 此方法在本例中未用到,可以指定跳转到某个页面  
         * @param switchTo  
         */  
        public void switchLayoutStateTo(int switchTo) {  
            while (mCurrentLayoutState != switchTo) {  
                if (mCurrentLayoutState > switchTo) {  
                    mCurrentLayoutState--;  
                    mFlipper.setInAnimation(inFromLeftAnimation());  
                    mFlipper.setOutAnimation(outToRightAnimation());  
                    mFlipper.showPrevious();  
                } else {  
                    mCurrentLayoutState++;  
                    mFlipper.setInAnimation(inFromRightAnimation());  
                    mFlipper.setOutAnimation(outToLeftAnimation());  
                    mFlipper.showNext();  
                }  
       
            }  
            ;  
        }  
       
        /**  
         * 定义从右侧进入的动画效果  
         * @return  
         */  
        protected Animation inFromRightAnimation() {  
            Animation inFromRight = new TranslateAnimation(  
                    Animation.RELATIVE_TO_PARENT, +1.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f);  
            inFromRight.setDuration(500);  
            inFromRight.setInterpolator(new AccelerateInterpolator());  
            return inFromRight;  
        }  
       
        /**  
         * 定义从左侧退出的动画效果  
         * @return  
         */  
        protected Animation outToLeftAnimation() {  
            Animation outtoLeft = new TranslateAnimation(  
                    Animation.RELATIVE_TO_PARENT, 0.0f,  
                    Animation.RELATIVE_TO_PARENT, -1.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f);  
            outtoLeft.setDuration(500);  
            outtoLeft.setInterpolator(new AccelerateInterpolator());  
            return outtoLeft;  
        }  
       
        /**  
         * 定义从左侧进入的动画效果  
         * @return  
         */  
        protected Animation inFromLeftAnimation() {  
            Animation inFromLeft = new TranslateAnimation(  
                    Animation.RELATIVE_TO_PARENT, -1.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f);  
            inFromLeft.setDuration(500);  
            inFromLeft.setInterpolator(new AccelerateInterpolator());  
            return inFromLeft;  
        }  
       
        /**  
         * 定义从右侧退出时的动画效果  
         * @return  
         */  
        protected Animation outToRightAnimation() {  
            Animation outtoRight = new TranslateAnimation(  
                    Animation.RELATIVE_TO_PARENT, 0.0f,  
                    Animation.RELATIVE_TO_PARENT, +1.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f,  
                    Animation.RELATIVE_TO_PARENT, 0.0f);  
            outtoRight.setDuration(500);  
            outtoRight.setInterpolator(new AccelerateInterpolator());  
            return outtoRight;  
        }  
       
        public boolean onDown(MotionEvent e) {  
            // TODO Auto-generated method stub  
            return false;  
        }  
       
        /*  
         * 用户按下触摸屏、快速移动后松开即触发这个事件  
         * e1:第1个ACTION_DOWN MotionEvent  
         * e2:最后一个ACTION_MOVE MotionEvent  
         * velocityX:X轴上的移动速度,像素/秒  
         * velocityY:Y轴上的移动速度,像素/秒  
         * 触发条件 :  
         * X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒  
         */  
        public boolean onFling(MotionEvent e1, MotionEvent e2, floatvelocityX,  
                float velocityY) {  
            if (e1.getX() - e2.getX() > FLING_MIN_DISTANCE  
                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  
                // 当像左侧滑动的时候  
                //设置View进入屏幕时候使用的动画  
                mFlipper.setInAnimation(inFromRightAnimation());  
                //设置View退出屏幕时候使用的动画  
                mFlipper.setOutAnimation(outToLeftAnimation());  
                mFlipper.showNext();  
            } else if (e2.getX() - e1.getX() > FLING_MIN_DISTANCE  
                    && Math.abs(velocityX) > FLING_MIN_VELOCITY) {  
                // 当像右侧滑动的时候  
                mFlipper.setInAnimation(inFromLeftAnimation());  
                mFlipper.setOutAnimation(outToRightAnimation());  
                mFlipper.showPrevious();  
            }  
            return false;  
        }  
       
        public void onLongPress(MotionEvent e) {  
            // TODO Auto-generated method stub  
       
        }  
       
        public boolean onScroll(MotionEvent e1, MotionEvent e2, floatdistanceX,  
                float distanceY) {  
            return false;  
        }  
       
        public void onShowPress(MotionEvent e) {  
            // TODO Auto-generated method stub  
       
        }  
       
        public boolean onSingleTapUp(MotionEvent e) {  
            // TODO Auto-generated method stub  
            return false;  
        }  
        public boolean onTouch(View v, MotionEvent event) {  
            // 一定要将触屏事件交给手势识别类去处理(自己处理会很麻烦的)  
            return mGestureDetector.onTouchEvent(event);  
        }  
    }  
     
  • 相关阅读:
    CSS定位属性position相关介绍
    JavaScript 预解析机制
    使用 python 实现π的计算
    turtle库的学习
    关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列
    关于wpf窗体中Allowtransparent和WindowsFormsHost的纠纷
    关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
    Python简史
    敏捷开发原则
    线程池
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/3300867.html
Copyright © 2020-2023  润新知